題目:給你一個字符串,在後面拼接一部分使得它變成回文串,使得串最短。輸出這個回文串。
分析:KMP,dp。這裡利用KMP算法將串和它的轉置匹配,看結束時匹配的長度就可以。
因為串比较長。使用KMP比较合適,KMP原理請参照。
說明:╮(╯▽╰)╭。
#include#include #include char strA[100001];char strB[100001];int next[100001];void getnext(char T[]) { next[0] = -1; int i = 0, j = -1; while (T[i]) { if (j == -1 || T[i] == T[j]) { ++ i; ++ j; if (T[i] != T[j]) next[i] = j; else next[i] = next[j]; }else j = next[j]; }} int KMP(char S[], char T[]){ int i = 0, j = 0; while (S[i]) { if (j == -1 || S[i] == T[j]) { i ++; j ++; }else j = next[j]; } return j;}int main(){ while (~scanf("%s",strA)) { int len = strlen(strA); for (int i = 0; i < len; ++ i) strB[i] = strA[len-1-i]; strB[len] = 0; getnext(strB); printf("%s%s\n",strA,&strB[KMP(strA, strB)]); } return 0;}