【HDU 3068】 最长回文|manacher

来源:互联网 发布:mac jdk默认安装路径 编辑:程序博客网 时间:2024/05/22 02:02

就是manacher算法

注意下 while(scanf()==1) 看来是和scanf的返回值有关 必须加==1了

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;char s[110000+10],tmp[110000*2+10];int f[110000*2+10],mmax,mx,id;int main(){while(scanf("%s",s+1)==1){int len=strlen(s+1);for(int i=1;i<=len;i++)tmp[i*2-1]='#',tmp[i*2]=s[i];len=len*2+2;tmp[len-1]='#';tmp[len]='@';mmax=1;id=1;mx=1;f[1]=1;for(int i=1;i<=len;i++){f[i]=1;if(i<mx)f[i]=min(mx-i+1,f[id*2-i]);while(tmp[i+f[i]]==tmp[i-f[i]]) f[i]++;if(f[i]+i-1>mx) mx=f[i]+i-1,id=i;mmax=max(f[i],mmax);}//for(int i=1;i<=len;i++) printf("%c",tmp[i]);printf("\n");//for(int i=1;i<=len;i++) printf("%d",f[i]);printf("\n");printf("%d\n",mmax-1);}return 0;}


0 0
原创粉丝点击