马拉车算法——求回文串起点hdu3294

时间:2023-03-08 21:52:57
#include<bits/stdc++.h>
using namespace std;
#define maxn 500005
int p[maxn];
char s[maxn],s_new[maxn],ch[];
int start;
int init(){
int len=strlen(s);
int j=;
s_new[]='$',s_new[]='#';
for(int i=;i<len;i++){
s_new[j++]=s[i];
s_new[j++]='#';
}
s_new[j]=;
return j;
}
int manacher(){
int len=init();
int mx=,id,res=;
start=;
for(int i=;i<len;i++){
if(mx>i)p[i]=min(p[id*-i],mx-i);
else p[i]=;
while(s_new[i-p[i]]==s_new[i+p[i]])p[i]++;
if(mx<i+p[i])
mx=i+p[i],id=i;
if(res<p[i]-)
res=p[i]-,start=(i-p[i]+)/-;
}
return res;
}
int main(){
while(scanf("%s%s",ch,s)!=EOF){
memset(p,,sizeof p);
int res=manacher();
if(res<=){
puts("No solution!");
continue;
}
cout<<start<<" "<<start+res-<<'\n';
for(int i=start;i<start+res;i++){
if(s[i]-ch[]>=)cout<<(char)(s[i]-ch[]+'a');
else cout<<(char)(s[i]-ch[]++'a');
}
puts("");
}
}