Hdu 3294 Girls' research (manacher 最长回文串)

题目链接:

  Hdu 3294  Girls‘ research

题目描述:

  给出一串字符串代表暗码,暗码字符是通过明码循环移位得到的,比如给定b,就有b == a,c == b,d == c,.......,a == z。

问最长回文串所在区间,以及最长回文串所表示的明码。

解题思路:

  字符串长度[1,200000],用manacher算法很轻松就搞定了。

  get√新技能请点击me

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 400005;
 7 char str[maxn];
 8 int p[maxn];
 9 int main ()
10 {
11     int x, maxlen;
12     char s[2];
13     while (scanf ("%s %s", s, str) != EOF)
14     {
15         memset (p, 0, sizeof(p));
16         int len = strlen (str);
17         for (int i=len; i>=0; i--)
18         {
19             str[i*2+2] = str[i];
20             str[i*2+1] = ‘#‘;
21         }
22         str[0] = ‘*‘;//str两端标志为不同字符,防止下标越界
23         x = maxlen = 0;
24         len = len * 2 + 1;
25         for (int i=2; i<len; i++)
26         {
27             if (p[x]+x > i)
28                 p[i] = min (p[2*x-i], p[x]-i+x);
29             else
30                 p[i] = 1;
31             while (str[i-p[i]] == str[i+p[i]])
32                 p[i] ++;
33             if (x+p[x] < i+p[i])
34                 x = i;
35             if (maxlen < p[i])
36                 maxlen = p[i];
37         }//manacher模板
38         if (maxlen <= 2)
39         {
40             printf ("No solution!\n");
41             continue;
42         }
43         int res = s[0] - ‘a‘, a, b;
44         for (int i=2; i<len; i++)
45             if (p[i] == maxlen)
46             {
47                 //找到回文串所在区间
48                 a = i - p[i] + 2;
49                 b = i + p[i] - 2;
50                 break;
51             }
52         printf ("%d %d\n", a/2-1, b/2-1);
53         for (int i=a; i<=b; i+=2)
54         {
55             str[i] -= res;
56             if (str[i] < ‘a‘)
57                 str[i] += 26;
58             putchar(str[i]);
59         }
60         printf("\n");
61     }
62     return 0;
63 }

Hdu 3294 Girls' research (manacher 最长回文串)

时间: 2024-10-05 01:32:27

Hdu 3294 Girls' research (manacher 最长回文串)的相关文章

HDU 3294 Girls&#39; research (Manacher算法 + 记录区间)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294 题目大意:输入一个字符ch和一个字符串,问如果把ch当作'a'的话,字符串的每个字符也要做相应变化,如b aa,若b为'a',则b前面的a就为'a'前面的'z',这里是循环表示,输出字符串的最长回文子串,如果最长回文子串串长为1,输出No solution! 几乎是模板题,唯一的特别之处就是要输出回文串字符,所以要记录max(Mp[i])对应的在原串中的字符区间,根据Manacher算法的步骤

Manacher 最长回文串问题

有人问你,一个字符串中最长的回文字串是谁? 作为一个 2B 青年, 一年前的我会这样回答:暴力枚举每个字串,判断合法与否? ╮(╯▽╰)╭ 就是没什么戏.... 后来,在机房的一个大牛的介绍下,我知道了 Manacher 算法. ............................ 其实 Manacher 和 KMP 是非常之像的. 令 rad[i] 表示以 第 i 个字符为中心的回文字串的半径长度. 那么我们考虑一下当前最远拓展到 j 编号为 rad[k],那么我们当前要计算的 rad[i

hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1012    Accepted Submission(s): 358 Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让

[manacher] hdu 3294 Girls&#39; research

题意: 给一个字符x代表真实的a 然后输出的时候转换 然后就是求最长回文子串的串是什么 长度要大于1 思路: 就是裸的manacher,弄清楚下标的转换关系就好了 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #inc

HDU 3294 Girls&#39; research

题目地址 manacher 1 #include<cstdio> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 const int Nmax=200005; 6 char s[Nmax]; 7 char str[Nmax*2+10]; 8 int p[Nmax*2+10]; 9 int hashh[Nmax*2+10]; 10 int id; 11 int maxlen; 12 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 3068 最长回文串 o(n) Manacher 算法

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

HDU ACM 4513 吉哥系列故事——完美队形II-&gt;求最长回文串(manacher算法)

分析:该題可以通过求最长回文串的方法来解决:求最长回文串使用manacher算法,O(n)时间复杂度. 注意:while(a[i-len[i]]==a[i+len[i]] && a[i-len[i]]<=a[i-len[i]+2])这里多出的判断a[i-len[i]]<=a[i-len[i]+2]即为该題的限制从左到中保证身高不降,因在回文串的计算过程中添加了额外的字符,所以这里是i-len[i]+2而不是i-len[i]+1,以避开添加的字符. #include<ios

Manacher(输出最长回文串及下标)

http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 5711    Accepted Submission(s): 2117 Problem Description One day, sailormoon girls