hdu 3068 最长回文 (Manacher算法)
来源:互联网 发布:苹果手机网络卡怎么办 编辑:程序博客网 时间:2024/05/30 13:42
mannacher算发的处理要将字符串的各个字母之间加上'#' a[0]='$' a[2*len+1]='#' a[2*len+2]='#'
#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<map>using namespace std;//typedef long long lld;const int oo=0x3f3f3f3f;//const lld OO=1LL<<61;const int MOD=(1e9)+7;const int maxn=110005;char str[maxn],a[maxn<<2];int p[maxn<<1];void init_string(int len){ a[0]='$'; for(int i=1;i<=len;i++) { a[2*i-1]='#'; a[2*i]=str[i]; } a[2*len+1]='#'; a[2*len+2]='#';}int Manacher(int len){ int mx = 0, id = 0; for (int i = 1; i <= len; i++) { if (mx > i) p[i] = min(mx - i, p[2 * id - i]); else p[i] = 1; while (a[i - p[i]] == a[i + p[i]]) p[i]++; if (p[i] + i > mx) { mx = p[i] + i; id = i; } } int ans=0; for(int i=1;i<=len;i++) { ans=max(ans,p[i]-1); } return ans;}int main(){ while(scanf("%s",str+1)!=EOF) { int n=strlen(str+1); init_string(n); cout<<Manacher(2*n+1)<<endl; } return 0;}/**abcd-> abcdabcabcda*/
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算法
- Python 日期和时间
- 一款经典简洁的CSS滑动门代码
- Android.mk的用法和基础
- HTML5比较成熟的技术
- 各种离职原因
- hdu 3068 最长回文 (Manacher算法)
- Android中的LayoutParams继承结构
- python 函数
- 详解Android中AsyncTask的使用
- Spring技术入门(六)
- robotium命令行启动
- oracle的if else查询
- Nested-Loop Join Algorithms
- c++ 中的重载全局new,delete