e307. 請讓我留在你的回憶裡

e307: 請讓我留在你的回憶裡

題目連結:e307: 請讓我留在你的回憶裡

題意:

輸入只有一行,含有一個字串 s (|s|<=10^8)
s 含有所有可印出的字元(包含空白),請你移除其中的空白
移除方式如下:
若連續的空白數為偶數,則全部移除
若為奇數,則移除到只剩下一個空白

解法:

C++:

開一個超大char陣列,把輸入一次讀進去,一次處理完再輸出
std::string 的處理很慢,而字元陣列較快
time:0.1s
memory used:153.4MB
code:
  1. #pragma GCC optimize("O3", "unroll-loops")
  2. #include<ios>
  3. char s[100<<20],answer[100<<20];
  4. inline void removespace(char* answer,char const* string,size_t size){
  5.     for(size_t i=0;i<size;){
  6.         if(string[i]!=' '){
  7.             *answer++ = string[i];
  8.             ++i;
  9.         }else{
  10.             uint_fast64_t n=0;
  11.             do{
  12.                 ++n;
  13.                 ++i;
  14.             }while(string[i]==' ');
  15.             if(n&1)*answer++ = ' ';
  16.         }
  17.         *answer=0;
  18.     }
  19. }
  20. int main(){
  21.         fread_unlocked(s,1,100<<20,stdin);
  22.         removespace(answer,s,100<<20);
  23.     fputs_unlocked(answer,stdout);
  24. }

Python:

replace() 超好用的~
time:0.4s
memory used:287.2MB
code:
  1. from sys import stdin
  2. from sys import stdout
  3. stdout.write(stdin.read().replace('  ', ''))

mmap()寫法:
time:0.4s
memory used:293.1MB
code:
  1. import mmap
  2. from sys import stdout
  3. from sys import stdin
  4. import contextlib
  5. with contextlib.closing(mmap.mmap(stdin.fileno(),0,access=mmap.ACCESS_READ)) as mm:
  6.  s=mm.readline().decode().replace('  ','')
  7.  stdout.write(s)

本人的分享到此結束
若有更好的想法或建議,請在留言區留言喔

Comments

Post a Comment

Popular Posts