nefu 1316 Ela的迴文串 manacher
阿新 • • 發佈:2019-01-04
DT2131
我用的方法是在計算p陣列的值,判斷是否構成迴文時看那個字元是否是ELA喜歡的字元。比如BAOAB以O為中心時判斷到B時就不++,這樣計算結果是對的。
但是以不喜歡的字元為 中心的情況還沒排除。這種只要在遍歷p陣列求MAX值時不考慮他即可。
#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=223000; int n,p[maxn]; char s[maxn],str[maxn]; int judge(int i) { if(str[i]=='A'||str[i]=='H'||str[i]=='I'||str[i]=='M'||str[i]=='O'||str[i]=='T'||str[i]=='U'||str[i]=='V'||str[i]=='W'|| str[i]=='X'||str[i]=='Y'||str[i]=='#')return 1; else return 0; } void kp() { int i,mx=0; int id=0; for(i=1;i<n;i++) { if(mx>i)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(str[i+p[i]]==str[i-p[i]]&&judge(i-p[i])) p[i]++; if(p[i]+i>mx) { mx=p[i]+i; id=i; } } } void init() { int i,k=1; str[0]='$'; for(int i=0;i<=n;i++) { str[k++]='#'; str[k++]=s[i]; } str[k++]='#'; n=k; } int main() { int t; cin>>t; while(t--) { scanf("%s",s); n=strlen(s); memset(p,0,sizeof(p)); init(); kp(); int max=-999; for(int i=0;i<n;i++) { //printf("%d ",p[i]); if(p[i]>max&&judge(i))max=p[i]; } if(max>0)printf("%d\n",max-1); else printf("0\n"); } return 0; }