Manacher算法(O(n)求得最长回文)
来源:互联网 发布:怎么玩网络赚钱 编辑:程序博客网 时间:2024/05/22 00:54
Manacher算法:
非常快的求回文字符串的算法,它和普通回文字符串检索的区别就是,后者每个字符串的回文值(自定义为最长回文向左/右扩张长度)初始都是为1,而Manacher算法则可以利用前面已知的回文值,初始值不再仅仅是1,这就是其优化的地方。
那么怎么利用前面已知的回文值得出有效信息呢?看这篇文章吧 数据结构与算法系列----Manacher算法【O(n)求得最长回文】,感觉讲的不错,看的其他文章都太复杂了,这个简洁明了,看了这个才懂了。
在这注意到了自己一个不好的习惯,将strlen(str)放入for循环,会导致超时。
HDU-3068 最长回文
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 110005;char str[N],new_str[N*2];int p[N*2];int Manacher(){ int len = strlen(str); new_str[0] = '$'; new_str[1] = '#'; int num = 2; for (int i = 0; i < len; i++) { new_str[num++] = str[i]; new_str[num++] = '#'; } new_str[num] = '\0'; int maxlen = 0;//最长回文长度 int id,mx = 0; for (int i = 1; i < num; i++) { if (i < mx) p[i] = min(p[2 * id - i], mx - i); else p[i] = 1; while (new_str[i - p[i]] == new_str[i + p[i]])//不需边界判断,因为左有'$',右有'\0' p[i]++; if (mx < i + p[i])//更新 { id = i; mx = i + p[i]; } maxlen = max(maxlen, p[i] - 1); } return maxlen;}int main(){ while (~scanf("%s", str)) { printf("%d\n", Manacher()); } return 0;}
POJ-3974
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1000005;char str[N],new_str[N*2];int p[N*2];int Manacher(){ int len = strlen(str); new_str[0] = '$'; new_str[1] = '#'; int num = 2; for(int i = 0;i < len;i++) { new_str[num++] = str[i]; new_str[num++] = '#'; } new_str[num] = '\0'; int maxlen = 0; int id,mx = 0; for(int i = 1;i < num;i++) { if(mx > i) p[i] = min(p[id*2-i],mx - i); else p[i] = 1; while(new_str[i + p[i]] == new_str[i - p[i]]) p[i]++; if(mx < i + p[i]) { id = i; mx = i + p[i]; } maxlen = max(maxlen,p[i]-1); } return maxlen;}int main(){ int ca = 1; while(~scanf("%s",str)) { if(strcmp(str,"END") == 0) break; printf("Case %d: %d\n",ca++,Manacher()); } return 0;}
0 0
- Manacher算法(O(n)求得最长回文)
- 最长回文子串算法-- Manacher算法--O(n)
- Manacher算法--O(n)最长回文子串算法
- Manacher算法O(n)求最长回文
- 最长回文(Manacher算法 时间复杂度O(n))
- 最长回文串 O(n)复杂度(manacher算法)
- manacher算法----O(n)最长回文串
- manacher算法----O(n)最长回文串
- HDU 3068 最长回文(manacher O(n)求回文算法)
- 最长回文子串 Manacher算法--O(n)回文子串算法
- 题目1 : 最长回文子串(Manacher算法--O(n)回文子串算法)
- Manacher算法,O(n)回文子串算法 以及模板题HDU3068最长回文串
- 求最长回文串 O(n)的manacher算法
- Manacher算法:最长回文子串O(n)
- manacher算法 (O(n)求最长回文子串)
- Manacher算法--O(n)求最长回文串+hdu3068
- 求取最长回文字符串,o(n)的最优算法manacher
- hdu 3068 最长回文串 o(n) Manacher 算法
- 系统负载是什么
- 动规-背包
- 查看memcache缓存所有key
- .p12文件.pem 互转
- PHP写入text的方法
- Manacher算法(O(n)求得最长回文)
- 系统自带分享以及友盟集成分享
- CSS3 边框 border-radius box-shadow
- Android apk动态加载机制的研究
- Wireshark图解教程(简介、抓包、过滤器)
- activity启动模式
- mac 上显示隐藏文件
- servlet与ajax的结合
- java中对象的引用类型及判断对象是否存活的算法