马拉车——最长回文子串长度回文串个数
Posted j666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了马拉车——最长回文子串长度回文串个数相关的知识,希望对你有一定的参考价值。
模板
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
以上是关于马拉车——最长回文子串长度回文串个数的主要内容,如果未能解决你的问题,请参考以下文章