【Manacher算法】poj3974 Palindrome

Manacher算法教程:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824

模板题,Code 附带注释:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 char b[10000001],a[10000001];
 6 char tmp[10000001];
 7 int n,f[10000001],zu;//f[i]表示插入一堆#后,以i为中心的最长回文子串の半径长度,
 8                 //故其减1后就是原串的最长回文子串的答案
 9                 //也是原串中以i为开端的最长回文串の长度。
10 int id,maxid,ans;
11 int main()
12 {
13     while(1)
14       {
15           scanf("%s",tmp);
16           if(tmp[0]==‘E‘)
17             break;
18           zu++;
19           n=strlen(tmp);
20           memset(b,0,sizeof(b));
21           memset(a,0,sizeof(a));
22           memset(f,0,sizeof(f));
23           ans=id=maxid=0;
24           for(int i=1;i<=n;i++)
25           b[i]=tmp[i-1];
26         a[1]=‘#‘;
27         for(int i=1;i<=n;i++)
28           {
29             a[i<<1]=b[i];
30              a[i<<1|1]=‘#‘;
31            }
32         a[0]=‘-‘;
33         a[(n+1)<<1]=‘+‘;
34         n=n<<1|1;
35         f[1]=1;
36         id=1;//用id这个变量记下取得这个最优maxid时的id值
37              //即右端扩展到maxid+1时,该回文串中心的位置
38         maxid=2;//maxid是曾经扫描到的回文串中,匹配到的最远的位置+1
39         for(int i=2;i<=n;i++)
40           {
41              if(maxid>i)//算法核心:防止重复匹配
42                  f[i]=min(f[(id<<1)-i]//以 关于id的对称点 为中心的的最长回文串长
43                                    //因为,分别在id两侧的两半回文串是完全一样的
44                        ,maxid-i    // 但是,以id的对称点为中心的最长回文串有可能超出
45                                    //以id为中心的最长回文串的范围,所以,限制其无法超出
46                                    //此范围
47                                    ); //(id<<1)-i 为 i 关于 id 的对称点
48               else
49               f[i]=1;//否则f[i]=1
50               for(;a[i+f[i]]==a[i-f[i]];f[i]++);
51               ans=max(ans,f[i]-1);
52             if(f[i]+i>maxid)//注意是f[i]+i,不是f[i]+i-1,因为maxid是匹配到的最远位置+1
53               {
54                 maxid=f[i]+i;
55                 id=i;//若以i为中心时,回文串可以扩展到更远的地方,更新id
56               }
57           }
58         printf("Case %d: %d\n",zu,ans);
59       }
60
61     return 0;
62 }
时间: 2024-12-19 20:01:23

【Manacher算法】poj3974 Palindrome的相关文章

Manacher算法--Poj3974

https://subetter.com/algorithm/manacher-algorithm.html #include<bits/stdc++.h> #define N 2050001 using namespace std; int len,p[N],Case,ans; char ch[N],s[N*2]; void manacher() { int cnt=1;s[0]='%';s[1]='#'; for(int i=0;i<len;i++) { s[++cnt]=ch[i]

Palindrome(最长回文串manacher算法)O(n)

Palindrome Time Limit:15000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "

POJ 3974 Palindrome Manacher算法题解

本题就是求最长的回文子串. 字符串超长,不过限时却是也很长的15秒,最长的限时之一题目了,如果限时短点的话,估计能过的人不多. 使用Mancher算法是可以秒杀的. 模板式的Manacher算法: #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #inc

【URAL】1297 Palindrome【字符串--manacher算法】

传送门:Palindrome 题意 求最长回文字符串,在学manacher算法,所以用了manacher,看到网上好多题解使用后缀数组来做的. 思路 manacher算法,参考<ACM国际大学生程序设计竞赛 算法与实现>的板子,一开始我以为板子的manacher算法是错误的,然后上网看题解. 直到我看到 https://blog.csdn.net/u012717411/article/details/53363444 文章,我才知道其实人家是对的,只不过我没理解. manacher算法在O(N

URAL1297 Palindrome【manacher算法】

1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The "U.S. Robots" HQ has just received a rather alarming anonymous letter. It states that the agent from the competing ?Robots Unlimited? has infiltrated into "U.S. Robotics".

hdu-3613 Best Reward (manacher算法)

Best Reward 题目链接 Description After an uphill battle, General Li won a great victory. Now the head of state decide to reward him with honor and treasures for his great exploit. One of these treasures is a necklace made up of 26 different kinds of gems

HDU 3616 Best Reward (Manacher算法 前缀回文+后缀回文)

Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 785    Accepted Submission(s): 338 Problem Description After an uphill battle, General Li won a great victory. Now the head of state

【转载】Manacher算法

本文原创:http://www.cnblogs.com/BigBallon/p/3816890.html只为了记录学习,不为抄袭!http://www.felix021.com/blog/read.php?2040 对于Manacher算法,主要的作用是用来求一个字符串的最长回文子串.这个算法的时间复杂度书线性的,即O(n)下面我分两个部分来讲1)预处理这个算法的精妙之处在于巧妙地避免了考虑回文子串的长度是奇数还是偶数(如果你还不知道什么是回文数,回文串,请自行baidu)在Manacher算法

POJ----(3974 )Palindrome [最长回文串]

Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 5121   Accepted: 1834 Description Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "Can you propose an eff