HDU----(3294)Girls' research(manacher)


Girls‘ research

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 537    Accepted Submission(s): 199

Problem Description

One day, sailormoon girls are so delighted that they intend to research about palindromic strings. Operation contains two steps:
First
step: girls will write a long string (only contains lower case) on the
paper. For example, "abcde", but ‘a‘ inside is not the real ‘a‘, that
means if we define the ‘b‘ is the real ‘a‘, then we can infer that ‘c‘
is the real ‘b‘, ‘d‘ is the real ‘c‘ ……, ‘a‘ is the real ‘z‘. According
to this, string "abcde" changes to "bcdef".
Second step: girls will
find out the longest palindromic string in the given string, the length
of palindromic string must be equal or more than 2.

Input

Input contains multiple cases.
Each
case contains two parts, a character and a string, they are separated
by one space, the character representing the real ‘a‘ is and the length
of the string will not exceed 200000.All input must be lowercase.
If the length of string is len, it is marked from 0 to len-1.

Output

Please execute the operation following the two steps.
If
you find one, output the start position and end position of palindromic
string in a line, next line output the real palindromic string, or
output "No solution!".
If there are several answers available, please choose the string which first appears.

Sample Input

b babd

a abcd

Sample Output

0 2

aza

No solution!

Author

wangjing1111

Source

2010 “HDU-Sailormoon” Programming Contest

代码:题目意思:

给定一个字符,以该字符作为‘a‘字符,举列子: c abac , c=a; b=z ,a=y;

然后找出他的最长回文子串,标出他的起始位置和最终位置...然后输出它的回文串(变换后的)

做法:  先用manacher求出它的最长回文串,算法起始点,可以考虑另外开一个数组,来存储原始字串....然后依据起始和结尾点来输出即可

,采用manacher算法处理回文子串

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define maxn 400050
 5 char str[maxn];
 6 int rad[maxn];
 7 int Min(int a,int b){
 8   return a<b?a:b;
 9 }
10 void init(int len,char s[]){
11     memset(rad,0,sizeof(int)*(2*len+2));
12     s[len*2+2]=‘\0‘;
13     int i,j=1;
14   for(i=len*2+1;i>0;i--){
15       if(i&1) s[i]=‘#‘;
16   else{ s[i]=s[len-j];
17      j++;
18    }
19   }
20   s[0]=‘$‘; //防止溢出
21 }
22 int manacher(int len){
23     int id,i,ans=0;
24     for(i=1;i<len*2+1;i++){
25      if(id+rad[id]>i)  rad[i]=Min(rad[id*2-i],id+rad[id]-i);
26      while(str[i-rad[i]]==str[i+rad[i]]) rad[i]++;
27      if(i+rad[i]>id+rad[id]) id=i;
28      if(ans<rad[i])ans=rad[i];
29     }
30     return ans;
31 }
32 int main(){
33   char sav[2];
34    int len,i;
35    //system("call test.in");
36    //freopen("test.in","r",stdin);
37    // fclose(stdin);
38    while(scanf("%s%s",sav,str)!=EOF){
39      len=strlen(str);
40      init(len,str);
41      int ans=manacher(len);
42      if(ans<=2)puts("No solution!");
43      else{
44      for(i=1;i<len*2+1;i++)
45          if(ans==rad[i]) break;
46          int st,en;
47          st=(i-ans)/2;
48          en=st+ans-2;
49         printf("%d %d\n",st,en);
50       for(int j=(st+1)*2;j<(st+ans)*2;j+=2){
51             if(str[j]-(sav[0]-‘a‘)<‘a‘)
52                printf("%c",str[j]+(‘z‘-sav[0]+1));
53             else
54                printf("%c",str[j]-(sav[0]-‘a‘));
55       }
56       puts("");
57      }
58    }
59   return 0;
60 }

HDU----(3294)Girls' research(manacher)

时间: 2024-10-02 08:04:04

HDU----(3294)Girls' research(manacher)的相关文章

(回文串 Manacher )Girls&#39; research -- hdu -- 3294

http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3294 Description One day, sailormoon girls are so delighted that they intend to res

吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513 题意比最长回文串就多了一个前面的人要比后面的人低这个条件,所以在p[i]++的时候判断一下s[i-p[i]]<=s[i-p[i]+2]就可以了; 用最长回文串算法manacher:套一下模板就可以了: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; con

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算法的步骤

hdu3294Girls&#39; research(manacher)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294 题目不难,感觉输出比较麻烦. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=2000010; 6 char s[maxn<<1]; 7 int r[maxn<<1]; 8 char ans[

Girls&#39; research---hdu3294(回文子串manacher)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294 给出一个字符串和加密的字符规律 例如 c abcba c代表把串中的c改成a,d改成b... b改成z,a改成y... 即上串是yzazy,然后求出它的最长回文子串, 并记录子串的开始下标和结束下标就行了: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; con

HDU 5371 (2015多校联合训练赛第七场1003)Hotaru&#39;s problem(manacher+二分/枚举)

HDU 5371 题意: 定义一个序列为N序列:这个序列按分作三部分,第一部分与第三部分相同,第一部分与第二部分对称. 现在给你一个长为n(n<10^5)的序列,求出该序列中N序列的最大长度. 思路: 来自官方题解:修正了一些题解错别字(误 先用求回文串的Manacher算法,求出以第i个点为中心的回文串长度,记录到数组p中 要满足题目所要求的内容,需要使得两个相邻的回文串,共享中间的一部分,也就是说,左边的回文串长度的一半,要大于等于共享部分的长度,右边回文串也是一样. 因为我们已经记录下来以

HDU 4513 吉哥系列故事——完美队形II(Manacher)

Problem Description 吉哥又想出了一个新的完美队形游戏! 假设有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一个新的队形,新的队形若满足以下三点要求,则就是新的完美队形: 1.挑出的人保持原队形的相对顺序不变,且必须都是在原队形中连续的: 2.左右对称,假设有m个人形成新的队形,则第1个人和第m个人身高相同,第2个人和第m-1个人身高相同,依此类推,当然如果m是奇数,中间那个人可以任意: 3.从左到中间那

HDU 3294 (Manacher) Girls&#39; research

变形的求最大回文子串,要求输出两个端点. 我觉得把'b'定义为真正的'a'是件很无聊的事,因为这并不会影响到最大回文子串的长度和位置,只是在输出的时候设置了一些不必要的障碍. 另外要注意一下原字符串s1中的字符在预处理以后的字符串s2中对应的坐标关系,这样输出的时候就可以照着这个关系转化. 轻松1A,嘿嘿 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5

Hdu 3294 Girls&#39; 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 #includ