hpuoj回文串问题(manacher+kmp)
1699: 回文串问题
时间限制: 1 Sec 内存限制: 128 MB 提交: 22 解决: 3 [提交][状态][讨论版]
题目描述
还是回文串问题,字符串是啥,大家应该都知道,就是满足 S[i] = S[L - i + 1] (1 <= i <= L)的串,现在遇到了一个问题,就是想问你一个字符串最少在后边加几个字符可以形成一个回文串,并最后输出形成的回文串
输入
输入包括多组数据,每组数据包含一个字符串
输出
输出转换后的回文字符串
样例输入
样例输出
题解:manacher,随着数组往前走,更新m和r,l没什么用,其实就是2*m-r,所以只需要管m和r就好了,由于多了"#"所以此时的值就是回文长度;只需要计算结尾处的最长回文就好了,以前做过类似题。。。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
#define T_T while(T--)
#define F(i,s,x) for(i=s;i<x;i++)
const double PI=acos(-1.0);
typedef long long LL;
const int MAXN=100010;
char a[MAXN],s[MAXN<<1];
int p[MAXN<<1];
int manacher(){
int len=strlen(s),i,l=1,r=1,mid=1,ans=0;
mem(p,0);
p[0]=p[1]=1;
F(i,2,len){
// if(r>i)p[i]=min(p[2*mid-i],r-i);
// else//仔细想了想,这段不要就可以,只不过可能耗时了一些;但是本校oj数据弱,就ac了。。。
p[i]=1;
while(s[i+p[i]]==s[i-p[i]])p[i]++;
if(p[i]+i>r)r=p[i]+i,mid=i;
if(r==len)ans=max(ans,p[i]);
}
return ans-1;
}
int main(){
while(~scanf("%s",a)){
int len=strlen(a);
s[0]='@';
int i;
F(i,0,len){
s[i*2+1]='#';
s[i*2+2]=a[i];
}
s[len*2+1]='#';s[len*2+2]='\0';
int ans=manacher();
// printf("%d\n",ans);
printf("%s",a);
for(i=len-ans-1;i>=0;i--)printf("%c",a[i]);puts("");
}
return 0;
}
kmp一遍a;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(x,y) memset(x,y,sizeof(x))
#define SI(x) scanf("%d",&x)
#define SL(x) scanf("%lld",&x)
#define PI(x) printf("%d",x)
#define PL(x) printf("%lld",x)
#define P_ printf(" ")
#define T_T while(T--)
#define F(i,s,x) for(i=s;i<x;i++)
const double PI=acos(-1.0);
typedef long long LL;
const int MAXN=100010;
char a[MAXN],b[MAXN];
int p[MAXN];
void getp(char *s){
int len=strlen(s);
int i=0,j=-1;
p[0]=-1;
while(i<len){
if(j==-1||p[i]==p[j]){
i++;j++;
p[i]=j;
}
else j=p[j];
}
}
int kmp(char *s,char *ms){
int len=strlen(ms);
getp(s);
int i=0,j=0;
while(i<len){
if(j==-1||ms[i]==s[j]){
i++;j++;
}
else j=p[j];
}
return j;
}
int main(){
while(~scanf("%s",a)){
memcpy(b,a,sizeof(a));
int len=strlen(a);
for(int i=0,j=len-1;i<len;i++,j--)b[i]=a[j];
int ans=kmp(b,a);
printf("%s",a);
for(int i=len-1-ans;i>=0;i--)printf("%c",a[i]);puts("");
}
return 0;
}
hpuoj回文串问题(manacher+kmp)的更多相关文章
- 【BZOJ4755】扭动的回文串(Manacher,哈希)
[BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...
- 字符串的最长回文串:Manacher’s Algorithm
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...
- APIO 2014 回文串(Manacher+后缀自动机+倍增)
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动 ...
- 牛客小白月赛13 小A的回文串(Manacher)
链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个 ...
- 洛谷P4324 扭动的回文串 [JSOI2016] manacher+哈希
正解:manacher+哈希 解题报告: 传送门 要不要先解释下题意,,,我开始看了半天来着QAQ 大概就,要求一个最长的回文串 这个回文串有两种构成可能 一种是单从一个串中拿出来的连续一段 另一种是 ...
- BZOJ3676 APIO2014回文串(manacher+后缀自动机)
由于本质不同的回文子串数量是O(n)的,考虑在对于每个回文子串在第一次找到它时对其暴力统计.可以发现manacher时若右端点移动则找到了一个新回文串.注意这样会漏掉串长为1的情况,特判一下. 现在问 ...
- BZOJ2565 最长双回文串 【Manacher】
BZOJ2565 最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"c ...
- UVA 11584 Partitioning by Palindromes 划分回文串 (Manacher算法)
d[i]表示前面i个字符划分成的最小回文串个数, 转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1. 要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处 ...
- bzoj 2565: 最长双回文串【manacher+线段树】
因为我很愚蠢所以用了很愚蠢的O(nlogn)的manacher+线段树做法 就是开两个线段树mn和mx分别表示左端点在i的最长回文子串和右端点在i的最长回文子串 用manacher求出每个点的最长回文 ...
随机推荐
- BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )
直接floyd.. ---------------------------------------------------------------------------- #include<c ...
- java代理课程测试 spring AOP代理简单测试
jjava加强课程测试代码 反射. 代理 .泛型.beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169 热身运动 ...
- C#读取网页
public bool getweb(string strURL,out string buf) { buf=""; try { //Uri url=new Uri(strURL, ...
- IOS 页面之间的传值(主讲delegate)
IOS的Delegate,通俗一点说就是页面之间的传值. 总结一下现在知道的IOS页面之间传值的方式有三种 1.使用NSNotification发送通知的传值 主要是通过NSNotificationC ...
- SubLime2 乱码解决
参考 http://www.fuzhaopeng.com/2012/sublime-text-2-with-gb2312-gbk-support/ 使用其中提到的方法二安装 首先下载http://su ...
- ftp一些东东
ftp如果绑定域名 登录时登录名应该写成 域名|用户名
- MVC-04 视图(3)
五.Url辅助方法 Url辅助方法与HTML辅助方法很类似,HTML辅助方法用来产生HTML标签,而Url辅助方法则负责用来产生Url网址. @Url.Action("About" ...
- perl5 第十一章 文件系统
第十一章 文件系统 by flamephoenix 一.文件输入/输出函数 1.基本I/O函数 1)open函数 2)用open重定向输入 3)文件重定向 4)指定读写权限 ...
- Java学习之DAO设计模式
DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口. 一个典型的DAO实现有三个组件: 1.一个DAO接口 2.一个DAO接口的具体类: 3.数据 ...
- PHP中用到的一些字符串函数
/*常用的字符串输出函数 * * echo() 输出字符串 * print() 输出一个或多个字符串 * die() 输出一条信息,并退出当前脚本 * printf() ...