---
# System prepended metadata

title: j245. 111北二4a.加密密文
tags: [資訊學科]

---

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