hdu 3068 最长回文子串 马拉车模板

前几天用后缀数组写过一次这题,毫无疑问很感人的TLE了-_-||

今天偶然发现了马拉车模板,O(N)时间就搞定

reference:http://acm.uestc.edu.cn/bbs/read.php?tid=3258

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 #define N 110010
 6 char s[N*2],str[N*2];
 7 int n,p[N*2];
 8
 9 void fun()
10 {
11     int len=(int)strlen(s);
12     str[0]=‘$‘;str[1]=‘#‘;
13     n=2;
14     for(int i=0;i<len;i++)
15     {
16         str[n++]=s[i];
17         str[n++]=‘#‘;
18     }
19     str[n]=‘\0‘;
20 }
21
22 void Manacher()
23 {
24     int i,id,mx=0;
25     for(i=1;i<n;i++)
26     {
27         if(mx > i)
28             p[i]=min(p[2*id-i],p[id]+id-i);
29         else
30             p[i]=1;
31         for(;str[i+p[i]] == str[i-p[i]];p[i]++)
32             ;
33         if(p[i]+i > mx)
34         {
35             mx=p[i]+i;
36             id=i;
37         }
38     }
39 }
40
41 void work()
42 {
43     int ans=-1;
44     for(int i=1;i<n;i++)
45         ans=max(ans,p[i]);
46     printf("%d\n",ans-1);
47 }
48
49 int main()
50 {
51     while(scanf("%s",s)!=EOF)
52     {
53         fun();
54         Manacher();
55         work();
56     }
57     return 0;
58 }
时间: 2024-11-06 01:12:51

hdu 3068 最长回文子串 马拉车模板的相关文章

HDU 3068 最长回文(Manacher模板题)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24164    Accepted Submission(s): 8852 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组c

hdu 3068 最长回文子串 TLE

后缀数组+RMQ是O(nlogn)的,会TLE..... 标准解法好像是马拉车,O(n).... 1 #include "algorithm" 2 #include "cstdio" 3 #include "cstring" 4 using namespace std; 5 #define maxn 220020 6 7 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; 8 int rank[maxn],heigh

HDU 3068 [最长回文子串]

#include<iostream> #include<string> #include<string.h> #include<algorithm> #define MAX_LEN 310000 using namespace std; int p[MAX_LEN]; int findBMstr(string &str){ int maxx=-1; memset(p,0,sizeof(p)); int mx=0,id=0; for(int i=1;i

hdu 3068 最长回文(manacher&amp;最长回文子串)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7317    Accepted Submission(s): 2500 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

hdu 5340 最长回文子串变形

http://acm.hdu.edu.cn/showproblem.php?pid=5340 Problem Description Can we divided a given string S into three nonempty palindromes? Input First line contains a single integer T≤20 which denotes the number of test cases. For each test case , there is

HDU 3068 最长回文 (manacher算法)

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9188    Accepted Submission(s): 3159 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU 3068(最长回文-manacher)[Template:manacher]

最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9660    Accepted Submission(s): 3353 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组

HDU - 3068 最长回文(manacher算法)

题意:给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 分析: manacher算法: 1.将字符串中每个字符的两边都插入一个特殊字符.(此操作的目的是,将字符串长度统一变成奇数,道理很容易想---奇数+偶数=奇数or偶数+奇数=奇数) eg:abba--->#a#b#b#a# 此外,为了便于处理边界,可在字符串开始处再加另外一个特殊字符. eg:#a#b#b#a#--->$#a#b#b#a# 2.数组 P[i] 来记录以字符S[i]为中心的最长回文子串向

HDU 3068 最长回文(初遇manacher)

这题可用拓展KMP分治法来做http://blog.sina.cn/dpool/blog/s/blog_677a3eb30100knj8.html 复杂度O(nlogn)这种方法好复杂而且代码很长,不易理解. 相比之下Manacher就简单多了,算法本身也很简单 这里个易懂的资料http://wenku.baidu.com/view/3031d2d3360cba1aa811da42.html 复杂度O(n) kuangbin的模版(有一处修改) /* * 求最长回文子串 */ const int