題目:http://hihocoder.com/PRoblemset/problem/1032
題目分析:manacher模板,RE了好多次。一開始是數組忘了開兩倍長度,接下來又是多算了最后一位的答案導致數組越界(即’$’),重點是忘了寫“if( i+temp[i]>p+temp[p] ) p=i;”這句如此重要的話……輸出答案的時候要注意分類討論一下。
CODE:
#include<iostream>#include<string>#include<cstring>#include<cmath>#include<cstdio>#include<cstdlib>#include<stdio.h>#include<algorithm>using namespace std;const int maxn=1000100;int temp[maxn<<1];string t,s;int n;int main(){ freopen("c.in","r",stdin); freopen("c.out","w",stdout); scanf("%d",&n); for (int q=1; q<=n; q++) { cin>>t; int tlen=t.size()-1; s=""; s+='@'; for (int i=0; i<tlen; i++) { s+=t[i]; s+='#'; } s+=t[tlen]; s+='$'; int slen=s.size(); int p=1,ans=0; temp[0]=temp[1]=0; for (int i=2; i<slen; i++) { temp[i]=max( 0,min( temp[2*p-i],p+temp[p]-i ) ); while ( s[i+temp[i]]==s[i-temp[i]-2] ) temp[i]++; if ( i+temp[i]>p+temp[p] ) p=i; if (s[i-1]=='#') ans=max(ans, temp[i]+(temp[i])%2 ); else ans=max(ans, temp[i]+(temp[i]-1)%2 ); } printf("%d/n",ans); } return 0;}
新聞熱點
疑難解答