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]=' ';
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 %dn",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 }
- C# 中使用 RSA加解密算法
- Tensorflow实践:用神经网络训练分类器
- 理解闭包 js回收机制
- java 解析 XML实例
- Java 线程内异常处理
- Raphael path 拖动实现
- 黑猿大叔-译文 | TensorFlow实现Batch Normalization
- Java后端WebSocket的Tomcat实现
- jwplayer 隐藏属性方法记载
- TensorFlow从0到1丨开篇:Hello TensorFlow !
- JS原型继承和类式继承
- 在Servlet的init方法中创建线程
- TensorFlow从0到1丨第2篇:TensorFlow核心编程
- AngularJS中的按需加载ocLazyLoad
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android短信验证服务分享
- android 震动和提示音的实现代码
- 一个简单的Android圆弧刷新动画
- AccessibilityService实现微信发红包功能
- 处理一次k8s、calico无法分配podIP的心路历程
- Android自定义控件实现时钟效果
- Android倒计时控件 Splash界面5秒自动跳转
- Android仿抖音上下滑动布局
- 一个简单的Android轨迹动画
- Android自定义圆环倒计时控件
- Android 使用URLConnection下载音频文件的方法
- Android自定义TimeButton实现倒计时按钮
- android自定义圆形倒计时显示控件
- android实现上下左右滑动界面布局
- Android使用MediaCodec将摄像头采集的视频编码为h264