马拉车――最长回文子串长度、回文串个数

匿名 (未验证) 提交于 2019-12-03 00:03:02

题目链接

模板

 1 #include<bits/stdc++.h>  2 using namespace std;  3 const int maxn=3e5+5;  4   5 char s[maxn],str[maxn];  6 int l1,l2,p[maxn],ans;  7   8 void init()  9 { 10     str[0]='$'; 11     str[1]='#'; 12     for(int i=0;i<l1;i++) 13     { 14         str[i*2+2]=s[i]; 15         str[i*2+3]='#'; 16     } 17     l2=l1*2+2; 18     str[l2]='*'; 19 } 20 int manacher() 21 { 22     int id=0,mx=0,ans=0; 23     for(int i=1;i<l2;i++) 24     { 25         if(mx>i)p[i]=min(p[2*id-i],mx-i); 26         else p[i]=1; 27         for(;str[i+p[i]]==str[i-p[i]];p[i]++); 28         if(p[i]+i>mx) 29         { 30             mx=p[i]+i; 31             id=i; 32         } 33         ans=max(ans,p[i]-1); 34         //ans+=p[i]/2;  回文串个数 35     } 36     return ans; 37 } 38 int main() 39 { 40     while(~scanf("%s",s)) 41     { 42         l1=strlen(s); 43         init(); 44         printf("%d\n",manacher()); 45     } 46     return 0; 47 }
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!