题意:在结尾补上最少的字符使得原串变成回文串。
思路:求最长回文后缀.前缀后缀这种东西上KMP贼好用。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
char s1[maxn],s2[maxn];
int fail[maxn];
void get_fail( char* P,int *f ){
f[0] = -1;
int m = strlen(P);
for( int i = 1;i < m;i++ ){
int j = f[i-1];
while( j != -1 && P[j+1]!=P[i] )j = f[j];
if( P[j+1]==P[i] ) f[i] = j+1;
else f[i] = -1;
}
}
int main()
{
while( ~scanf("%s",s1) ){
int len = strlen(s1);
for( int i = 0;i < len;i++ ){
s2[i] = s1[len-i-1];
}
s2[len] = '\0';
strcat( s2,s1 );
get_fail( s2,fail );
int l2 =strlen(s2);
int p = fail[l2-1];
while( p != -1 && p >= len ) p = fail[p];
int t = len;
if( p != -1 ) {
for (int i = 0; i + p < len - 1; i++) {
s1[t++] = s1[i];
}
}
reverse( s1+len,s1+t );
s1[t] = '\0';
printf("%s",s1);
}
return 0;
}