題目:給你一個字符串,在後面拼接一部分使得它變成回文串,使得串最短。輸出這個回文串。
分析:KMP,dp。這裡利用KMP算法將串和它的轉置匹配,看結束時匹配的長度就可以。
因為串比较長。使用KMP比较合適,KMP原理請参照AC自動機總結。
說明:╮(╯▽╰)╭。
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
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;
}