nod-1089-最长回文子串 V2
2016-05-27 23:56
246 查看
题目
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
思路:
最长回文子串,之前只知道最快也就是nlogn 后缀树,也不太会写;最近发现有o(n)的manacher算法,网上一搜一大堆,可以查查看看;推荐个写的相对好理解的:https://www.felix021.com/blog/read.php?2040
代码:
注意不要使用string进行+=操作,否则会超时,太耗费时间了。。。。。。#include<iostream> #include<string> using namespace std; int p[200005]; char ch[200005]; int main() { string s; //string ss("$#"); ch[0] = '$'; ch[1] = '#'; int num = 2; cin >> s; for (int i = 0; i < s.length(); ++ i) { //ss = ss + s[i] +'#'; ch[num ++] = s[i]; ch[num ++] = '#'; } int mx = 0; int id = 0; for (int i = 1; i < num; ++ i) { if (mx > i) { p[i] = min(p[2*id - i], mx - i); } else p[i] = 1; while(ch[i+p[i]] == ch[i-p[i]]) p[i]++; if (i+p[i] > mx) { mx = i + p[i]; id = i; } } int mmax = 0; for (int i = 1; i < num; ++ i) { if (p[i] - 1 > mmax) { mmax = p[i] - 1; } } cout << mmax <<endl; return 0; }
相关文章推荐
- 3个数和为0
- 杭电ACM 1089-1096
- 51Nod 大数乘法
- 51Nod A^BmodC
- 51Nod 逆序数
- 51NOD 1020 逆序排列
- 1089. Insert or Merge (25)【排序】——PAT (Advanced Level) Practise
- 51nod 算法马拉松11 A 翻硬币
- 51nod(1264)——线段相交
- 51nod(1183)——dp
- FatMouse的奶酪
- 动态规划初步总结(1)(51Nod,CODE[VS]为例题)
- 51Nod 1086 背包问题 V2(二进制多重背包)
- 51nod 1241 特殊的排序 最少移动次数
- 51nod 可能的路径
- 51nod 1065 最小正子段和(最小正字段和)
- 51nod 1405 树的距离之和 (两次dfs,树形dp)
- 51nod 锁屏密码
- 51nod 1495 中国好区间
- 51nod 1443 路径和树