经典算法——最长回文子串
来源:互联网 发布:js脚本小游戏 编辑:程序博客网 时间:2024/05/17 01:33
- #include<iostream>
- #include<cstdio>
- #include<string> //cin>>输入字符串必须添加的头文件
- #include<cstring>//C++中使用memset必须添加的头文件
- #include<algorithm>
- #include<vector>
- using namespace std;
- const int N = 2 * (1e6) + 3;
- char s[N];
- int p[N];
- //利用manacher算法求最长回文子串
- void manacher(char* s, int len)
- {
- p[0] = 1;
- int mx = 0, id = 0;
- for (int i = 1; i < len; i++)
- {
- p[i] = mx > i ? min(p[id * 2 - i], mx - i) : 1;
- while (s[i + p[i]] == s[i - p[i]]) p[i]++;
- if (i + p[i] > id + p[id])
- {
- id = i;
- mx = i + p[i];
- }
- }
- }
- int main()
- {
- int n;
- vector<string>vec;
- while (cin >> n)
- {
- vec.clear();
- for (int k = 0; k < n; ++k){
- cin >> s;
- vec.push_back(s);
- }
- for (int k = 0; k < n; ++k){
- memset(s, 0, sizeof(s));//每次求得一个字符串的最长回文子串后,必须将数组s和p清零,不然会对后面的结果产生影响
- memset(p, 0, sizeof(p));
- int len = vec[k].size();
- for (int j = 0; j < len; ++j){
- s[j] = vec[k][j];
- }
- for (int i = len; i >= 0; i--)
- {
- s[(i << 1) + 1] = '#';
- s[(i << 1) + 2] = s[i];
- }
- s[0] = '*'; //防止数组越界
- len = len * 2 + 2;
- manacher(s, len);
- int ans = 0;
- for (int i = 0; i < len; i++)
- ans = max(ans, p[i] - 1);
- printf("%d\n", ans);
- }
- return 0;
- }
- }
0 0
- NOJ1100最长回文子串——经典算法
- 经典算法——最长回文子串
- 经典算法——最长回文子串
- 最长回文子串算法入门经典
- 经典算法——最长回文子序列
- 算法导论—最长回文子串和子序列
- 算法竞赛入门经典 3.3 最长回文子串
- 笔试面试算法经典--最长回文子串
- Manacher算法——求最长回文子串
- hihoCoder#1032 最长回文子串——Manacher算法
- 最长回文子串——Manacher算法
- 最长回文子串——Manacher算法
- 最长回文子串——Manacher算法
- [转] 最长回文子串——Manacher算法
- 最长回文子串——Manacher 算法
- Manacher算法——最长回文子串
- 求最长回文子串——Manacher 算法
- 最长回文子串——Manacher 算法
- FLV文件格式解析
- 大数据处理的关键层次架构
- 父子控制器
- LeetCode 3 Longest Substring Without Repeating Characters
- Ecshop错误大汇总
- 经典算法——最长回文子串
- Intent传递对象——Serializable和Parcelable区别
- sqlmap中使用tamper脚本绕过waf
- Linux grep命令
- **从今天开始利用博客记录自己的学习经历~!**
- 抽象类与接口的典型应用:猫狗案例,加入调高的额外功能
- 安卓按比例布局,layout_weight用法、合用weightSum属性和layout_weight属性
- 【Android】Share via whatsapp
- iOS学习笔记12--纯代码实现原生UITabBarController,手势滑动切换视图