分析:补上最少的字符,使得字符串是个回文串。
KMP算法,把原串和逆串匹配,求出最大重合部分,最后输出。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e5+10;
int Next[maxn];
char s[maxn],p[maxn];
int len;
void get_next(){
Next[0] = Next[1] = 0;
int j = 0;
for (int i=1; i<len; i++) {
while (j && p[j]!=p[i]) j = Next[j];
if (p[j]==p[i]) j++;
Next[i+1] = j;
}
}
void solve(){
int j = 0;
for (int i=0; i<len; i++){
while(j && p[j]!=s[i]) j = Next[j];
if (p[j]==s[i]) j++;
}
printf("%s%s\n",s,p+j);
}
int main(){
while (~scanf("%s",s)){
len = strlen(s);
strcpy(p,s);
reverse(p,p+len);
get_next();
solve();
}
return 0;
}