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;
}
```