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求出每个点的最长回文 ...
随机推荐
- C++中++运算符的重载
void showTime() const; Clock& operator ++(); Clock operator ++(int); private: int hour,minute,se ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一)
作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...
- WTL error C3861: 'DDX_Control': identifier not found
error C3861: 'DDX_Control': identifier not found 继承类加上 public CWinDataExchange<CMainDlg>, ...
- 编写带参数decorator
无参的@log装饰器: def log(f): def fn(x): print 'call ' + f.__name__ + '()...' return f(x) return fn 发现对于被装 ...
- 12-C语言字符串
目录: 一.字符串 二.字符串输入输出函数 三.指针数组(字符串数组) 回到顶部 一.字符串 1 一组字符数组,以数组的首地址开始,以ASC码的'\0'结束. 2 字符串与普通数组的区别:普通数组没有 ...
- 交换右ctrl和capslock
记得几年前开始使用Emacs,因为使用ctrl键太频繁了,所以上网查了下解决方案,看到这篇文章 .把capslock和左ctrl交换,简直要泪流满面啊!立马照着做,从此在所有使用的电脑上都对此进行了设 ...
- 怪兽z主机 驱动集
这里给买家朋友送上我们主机的驱动包. 1.主板驱动. 访问密码 f334 http://yunpan.cn/QNTGxehcnLBW5 2.AMD显卡催化剂 amd catalyst(没装的话,无法 ...
- 对程序员的不尊重是中国it产业的悲哀。
电脑刚进入中国时,“程序员”三个字是一份令人尊敬的岗位,那个时候中国互联网人才奇缺.程序员的价格也就水涨船高.小的时候电视里到处播放着电脑培训学院的招生广告.一说到程序员,给我们的印象都是白领,高薪的 ...
- QT实现,通过URL下载文件的接口实现
今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...
- AssetManager中的路径参数不能包含"assets/"
String path = “music/bg.mp3”: //正确的参数 //String path = “assets/music/bg.mp3”: //错误的参数 //String path = ...