Manacher算法 线性时间求最大回文子串长度
2016-03-10 16:04
302 查看
原理性的东西在这里得到:http://www.open-open.com/lib/view/open1419150233417.html
/*Manacher算法*/ #include<iostream> #include<vector> #include<map> #include<stdio.h> #define maxn 100000 #define min(a,b) a>b?b:a #define max(a,b) a>b?a:b using namespace std; char str[maxn]; //元字符串 char tmp[2*maxn+1]; //转换后的字符串 int length; int len[2*maxn+1]; void Get_New() { int i,j; tmp[0]='@'; //字符串开头增加一个特殊字符,防止越界 for(i = 1;i <= 2*length;i += 2){ tmp[i] = '#'; tmp[i+1] = str[i/2]; } tmp[2*length+1]='#'; } int Manacher() { int i; int mid,maxlen,ans; len[0] = 1; mid = ans = maxlen = 0; for(i = 1;i <= 2*length+1;i ++){ if(maxlen > i){ len[i] = min(maxlen-i,len[2*mid-i]); } else{ len[i] = 1; } while(tmp[i-len[i]] == tmp[i+len[i]]) len[i] ++; printf("len[%d] = %d ",i,len[i]); printf("\n"); if(len[i] + i > maxlen){ maxlen = len[i] + i; mid = i; } ans = max(ans,len[i]); } return ans - 1; } int main(void) { int i,ans,pos; cin >>length; for(i = 0;i < length;i++) cin >> str[i]; Get_New(); ans = Manacher(); cout <<ans <<endl; return 0; }
相关文章推荐
- win7安装omnetpp-4.6
- node.js环境
- 【练习】内容提供器一、访问其他程序的数据
- 002_第三部分_[函数 / 高阶函数 / 装饰器]
- Andriod 反编译 重新打包 技巧感想记录
- POJ 1741 树形dp
- ThinkPHP邮件发送函数
- iOS通过dSYM文件分析crash
- core dump定位错误位置
- JS Array.join 的使用
- 【网络流+可持久化线段树】[UOJ#77/BZOJ3218]A+B Problem
- C++ 和 C# 开发类型对应信息
- Oracle学习笔记--3、基本函数的使用
- 【Android疑难杂症】GridView动态设置Item的宽高导致第一个Item不响应或显示不正常的问题
- Mac下配置环境变量
- My First Day In New Office
- iOS 利用长按手势移动 Table View Cells
- 引用程序集没有强名称解决办法
- IT十八掌作业_java基础第七天_匿名内部类、异常、包和jar
- JS Array.reverse 将数组元素颠倒顺序