首页 > 代码库 > HDU3068 最长回文
HDU3068 最长回文
Description
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
Input
回文就是正反读都是一样的字符串,如aba, abba等
Input
输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000
字符串长度len <= 110000
Output
每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa abab
Sample Output
4 3
当做是Manacher算法的模板题吧...估计实用价值和KMP没什么区别
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=250010; 4 char s[N],ss[N]; 5 int RL[N]; 6 int calc(){ 7 ss[0]=‘#‘; 8 for(int i=1,i_end=strlen(s);i<=i_end;++i){ 9 ss[(i<<1)-1]=s[i-1]; 10 ss[(i<<1|1)-1]=‘#‘; 11 } 12 int len=strlen(s)<<1|1; 13 int MaxRight=0,pos=0,maxlen=0; 14 for(int i=0;i<=len;++i){ 15 if(i<MaxRight)RL[i]=min(RL[(pos<<1)-i],MaxRight-i); 16 else RL[i]=1; 17 18 while(i-RL[i]>=0&&i+RL[i]<=len&&ss[i-RL[i]]==ss[i+RL[i]])++RL[i]; 19 if(RL[i]+i-1>MaxRight) 20 MaxRight=RL[i]+i-1,pos=i; 21 maxlen=max(maxlen,RL[i]); 22 } 23 return maxlen-1; 24 } 25 int main(){ 26 while(~scanf("%s",s)) 27 printf("%d\n",calc()); 28 return 0; 29 }
HDU3068 最长回文
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。