link:https://zerojudge.tw/ShowProblem?problemid=j245 * 本題用 string 吃了 TLE,於是改試 char,快很多 * 大部分照著題目流程跑一次即可,中間可以把一些步驟合併,增加效率。 ```C++= #include <stdio.h> #include <string.h> using namespace std; const int maxs = 1e7; char s[maxs+10] = {'0'}; char t[maxs+10] = {'0'}; char t1[maxs+10] = {'0'}; // 用 string 會 TLE // char 儲存會快很多 int main() { scanf("%s",&s); int len = strlen(s); if (len%2==0) { memmove(s+1,s,len); // 利用 memmove 來插入字元 s[0] = s[(int)len/2]; s[len+1] = s[(int)len/2 +1]; memmove(&s[(int)len/2],&s[(int)len/2 + 2],strlen(s) - 2); // 利用 memmove 的技巧來刪除中間的字元 } else { memmove(s+1,s,len); s[0] = s[(int)len/2 +1]; s[len+1] = s[(int)len/2 +1]; memmove(&s[(int)len/2 + 1],&s[(int)len/2+2],strlen(s)-1); len++; } //printf("%s\n",s); int left = 0; int right = len-1; // 左右逼近的技巧,這樣就不用一直 memmove() char cur; for (int i=0;i<len;i++){ if (right<0) break; // 小心這裡,需要設斷點 if (s[i]%2 == 0){ cur = s[right]; t[i] = cur; if (cur%2 == 0) t1[i] = 'a'; else t1[i] = 'b'; right--; } else { cur = s[left]; t[i] = cur; if (cur%2 == 0) t1[i] = 'a'; else t1[i] = 'b'; left++; } } //printf("%s\n",t); int h = 0; for (int i=0;i<4;i++){ char k; if (s[i]%2==0) k = 'a'; else k = 'b'; if (k!=t1[i]) h++; } if (h==0) printf("%s",t); else{ for (int i=0;i<len;i++) t1[i] = t[i]+h; printf("%s",t1); } return 0; } ```