题目大意:
给你一个字符串,让你在结尾添加最少的字符使其成为回文字符串。
解决方法:
字符串hash
我的代码:
#include <cstdio>
#include <string>
#include <iostream>
#include <cstring>
#define maxn 100100
#define seed 131
#define ull signed long long
using namespace std;
char s[maxn];
ull base[maxn],f[maxn],l[maxn];
int n;
int ok(int len){
f[len]=f[len-1]*seed+s[n-len];
l[len]=s[n-len]*base[len-1]+l[len-1];
//cout<<len<<endl;
//cout<<s[n-len]<<" "<<base[0]<<endl;
//cout<<f[len]<<" "<<l[len]<<endl;
if (f[len]==l[len]) return 1;
return 0;
}
int main (){
//freopen("test.in","r",stdin);
base[0]=1;f[0]=l[0]=0;
for (int i=1;i<maxn;i++) base[i]=base[i-1]*seed;
while (~scanf("%s",s)){
int len=1,ans=0;
n=strlen(s);
while (len<=n) {
if (ok(len)){
ans=len;
}
len++;
}
printf("%s",s);
//cout<<ans<<endl;
for (int i=n-ans-1;i>=0;i--) printf("%c",s[i]);printf("\n");
}
return 0;
}