hdu 3068 最长回文(manacher算法)
来源:互联网 发布:高鹗续写红楼梦知乎 编辑:程序博客网 时间:2024/05/17 09:01
题意:给出一个字符串,求这个字符串的最长回文子串。
关于manacher算法网上有很多讲解,我不再赘述。但是我看大部分讲解都没有解释为什么manacher算法的复杂度是O(n),我尝试着解释一下。
代码的关键在这里:
dp[i]=line>i?min(dp[mark*2-i],line-i):1;
其中dp[i]表示以i为中心回文串向左右扩张的长度;line表示当前检索的回文串的最右边界(不是最长回文串的右边界,是所有字符的右边界中最右的);mark是最右边界的回文串的中间点;mark*2-i是关于i关于mark对称的点。
当line<=i或者line>i&&dp[mark*2-i]>=line-i的时候:原字符串的扫描都是以当前最右边界为起点(如果line<=i的话,i就是当前最右边界)。在这种情况下,保证了line一直在往右扫描,也就保证了每个字符只扫描了一次。
当line>i&&dp[mark*2-i]<line-i的时候:实际上这种情况,代码下部的while循环最多执行一次。因为i点与mark*2-i对称,所以mark*2-i与i点左右不超出line的部分是完全一样的,既然mark*2-i这个点在左右扫描的时候只能扫描dp[mark*2-i]的长度,那么dp[i]也只能扫描相同的长度。
附上AC代码:
#include<stdio.h>#include<string.h>#define N 220010char str_in[N],str[N];int dp[N],line,mark;int min(int x,int y){ if(x<y) return x; else return y;}int main(){ while(scanf("%s",str_in)!=EOF) { getchar(); int str_in_ln=(int)strlen(str_in); str[0]='$'; for(int i=0;str_in[i]!='\0';i++) { str[2*i+1]=str_in[i]; str[2*i+2]='$'; } str[2*str_in_ln+1]='\0'; memset(dp,0,sizeof(dp)); int str_ln = 2*str_in_ln+1; line=0; mark=0; int ans=0; for(int i=0;i<str_ln;i++) { dp[i]=line>i?min(dp[mark*2-i],line-i):1; while(i+dp[i]<str_ln&&i-dp[i]>=0&&str[i+dp[i]]==str[i-dp[i]]) dp[i]++; if(i+dp[i]>line) { line=i+dp[i]; mark=i; } if(dp[i]>ans) ans=dp[i]-1; } printf("%d\n",ans); } return 0;}
0 0
- hdu 3068 最长回文 (manacher算法)
- HDU 3068 最长回文(Manacher 算法)
- hdu 3068 最长回文(manacher算法)
- Hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文(manacher算法)
- HDU 3068 最长回文(Manacher算法)
- hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文(manacher算法)
- Hdu 3068 最长回文 (manacher算法)
- HDU-3068-最长回文 (Manacher算法)
- hdu 3068 最长回文(manacher算法)
- HDU 3068 最长回文 Manacher算法
- hdu 3068 最长回文 manacher算法
- Hdu 3068 最长回文 Manacher 算法
- hdu 3068 最长回文 (Manacher算法)
- HDU 3068 最长回文 (Manacher算法)
- hdu-3068 最长回文 【Manacher算法】
- HDU 3068 最长回文 (manacher算法)
- 山科大online judge 1094 :去行首行尾的空白符
- Docker网络详解
- 战网登录-战网选择国家-战网battle.net问题解决
- js控制页面只刷新一次
- 学习Redis从这里开始
- hdu 3068 最长回文(manacher算法)
- OpenCV Mat 类
- eclipse查看JDK源码
- IE浏览器打不开网页,其他浏览器却可以打开
- LevelDB源码分析2-整数编解码
- YUV数据格式
- shader 光照贴图
- android标题栏
- android广播简单使用