UVALive 4975 Casting Spalls
2013-10-18 22:11
239 查看
题目链接
题意: 找一个最长的连续子串,使该子串符合这种形式: WRWR, 其中R使W的逆序串。[u][/u]
分析:根据题意可知 整个子串使回文,且平分两半后各自也是回文。 求回文有个经典的算法:manachar。
代码:
题意: 找一个最长的连续子串,使该子串符合这种形式: WRWR, 其中R使W的逆序串。[u][/u]
分析:根据题意可知 整个子串使回文,且平分两半后各自也是回文。 求回文有个经典的算法:manachar。
代码:
//回文长度:p[i]-1 #include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> using namespace std; const int maxn=300050; char s[maxn*2]; int p[maxn*2]; void manachar() { int i,id=0,len=strlen(s); for(i=len;i>=0;i--){ s[(i<<1)+2]=s[i]; s[(i<<1)|1]='#'; } s[0]='^'; len=len*2+1; for(i=2;i<len;i++) { if(p[id]+id>i) p[i]=min(p[(id<<1)-i],p[id]+id-i); else p[i]=1; while(s[i-p[i]] == s[i+p[i]]) p[i]++; if(i+p[i]>id+p[id]) id=i; } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",s); manachar(); int ans=0,h; for(int i=3;i<len;i+=2){ int M=p[i]-1; M=(M>>2)<<2; for(;M>ans;M-=4) { h=M>>1; if(p[i+h]<(M>>1)) continue; if(p[i-h]<(M>>1)) continue; ans=M; break; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- UVAlive 4975 Manacher+枚举
- UVALive - 4975 Casting Spells Manacher回文串
- UVALive 4975 Casting Spells
- UVALive 4975 (LA 4975) Casting Spells Manacher + Set维护
- UVALive 4975 - Casting Spells Manacher+科学枚举
- UVALive - 4975_Casting Spells
- uvalive 4975
- uvalive 2757(贪心)
- UVALive 5029
- POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 1220 Party at Hali-Bula(树型动态规划)
- UVALive 7264 Kejin Game 2015北京现场赛【最小割】
- UVALive X-Plosives(并查集+略坑的输入)
- uvalive3026 Period (KMP+结论)
- uvalive 6955 Finding Lines rand()应用
- UVaLive 4327 | POJ 3926 - Parade (单调队列优化DP)
- UVALive6533 inverting huffman
- UVALive 4992 Jungle Outpost(半平面交判存)
- uvalive5986(贪心)
- UVA1585 UVALive3354 Score【水题】
- UVALive - 4328 Priest John's Busiest Day 贪心