hdu 3294 Manacher模版题

来源:互联网 发布:机械电路设计软件 编辑:程序博客网 时间:2024/06/08 06:01

点击打开链接

#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int M =1010000;char s[M],t[M],c;int len,p[M]; // p[i] 以i为中心的回文  i到最右端长度 void Init(){int i;t[0]='@';for(int i=1;i<=2*len;i+=2){t[i]='#';t[i+1]=s[i/2];}t[2*len+1]='#';t[2*len+2]='$';t[2*len+3]=0;len=2*len+1;} void Manacher(){int mx=0,ans=0,po=0,l,r;for(int i=1;i<=len;i++){if(i<mx){//i关于po对称 j=2*po-i//p[i]>=p[j]  p[j]超过po的范围 则p[i]对应的超出范围 尚未匹配无法判断 p[i]=min(p[2*po-i],mx-i);}else{p[i]=1;}while(t[i-p[i]]==t[i+p[i]]) {p[i]++;}if(i+p[i]>mx){mx=i+p[i];po=i;}if(ans<p[i]){ans=p[i];l=(i-p[i])/2;//记录原串左右位置 r=(i+p[i])/2-2;//}}// t中'#'个数比原串s长度始终大一 t的长度为 x+x-1=2*p[i]-1; 原串s长度为 p[i]-1  ans--;if(ans<2){cout<<"No Solution!"<<endl;return;}cout<<l<<" "<<r<<endl;c=c-'a';//后退c个 for(int i=l;i<=r;i++){s[i]-=c;if(s[i]<'a')s[i]+=26;  cout<<s[i];}cout<<endl;}int main(){while(cin>>c){scanf("%s",s); len=strlen(s);Init();Manacher(); }return 0;}


0 0