LightOJ 1258 Making Huge Palindromes(KMP)
题意
给定一个字符串 \(S\) ,一次操作可以在这个字符串的右边增加任意一个字符。求操作之后的最短字符串,满足操作结束后的字符串是回文。
\(1 \leq |S| \leq 10^6\)
思路
\(\text{KMP}\) 的 \(fail\) 数组是整个算法最重要的东西,能拓展出很多东西。
对于一个模式串(pattern)\(P\) ,\(fail\) 数组为 \(f\) ,那么 \(f[i]\) 就是如果匹配到 \(i\) 这个位置失配,下次去尝试的位置,也就说明了从字符串头到 \(f[i]-1\) 这一段,在 \(i-1\) 位置以左有一段相同的串。这是对 \(fail\) 数组的一种理解,想要更深入的理解,最好的方法就是做题。
本题等价于在 \(S\) 左边删去任意字符使剩下的字符串回文,只需求出字符串 \(S\) 从右开始能得到最长的回文串长度即可。设模式串为 \(S\) 的反字符串 \(P\),回文串长度就是 \(S\) 在最右端能匹配 \(P\) 的最长长度。
代码
#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
typedef long long LL;
using namespace std;
const int N=1e6+5;
char T[N],P[N];
int n,f[N];
int main()
{
int Case;
scanf("%d",&Case);
FOR(cas,1,Case)
{
scanf("%s",T);
n=strlen(T);
FOR(i,0,n-1)P[i]=T[n-i-1];
P[n]='\0';
f[0]=f[1]=0;
FOR(i,1,n-1)
{
int j=f[i];
while(j&&P[i]!=P[j])j=f[j];
f[i+1]=j+(P[i]==P[j]);
}
int j=0;
FOR(i,0,n-1)
{
while(j&&T[i]!=P[j])j=f[j];
if(T[i]==P[j])j++;
if(i==n-1)printf("Case %d: %d\n",cas,n+(n-j));
}
}
return 0;
}
LightOJ 1258 Making Huge Palindromes(KMP)的更多相关文章
- lightOJ 1258 Making Huge Palindromes(KMP)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1258 就是求逆串和原串的匹配长度 答案就是原串长度的2倍减去匹配长度即可 第一次我将原 ...
- LightOJ 1258 Making Huge Palindromes (Manacher)
题意:给定上一个串,让你在后面添加一些字符,使得这个串成为一个回文串. 析:先用manacher算法进行处理如果发现有字符匹配超过最长的了,结束匹配,答案就是该字符前面那个长度加上该串原来的长度. 代 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- poj2406 Power Strings(kmp)
poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...
- POJ 2406 Power Strings(KMP)
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- codeM编程大赛E题 (暴力+字符串匹配(kmp))
题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...
- LightOj 1265 - Island of Survival(概率)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1265 题目大意:有一个生存游戏,里面t只老虎,d只鹿,还有一个人,每天都要有两个生物碰 ...
- 经典串匹配算法(KMP)解析
一.问题重述 现有字符串S1,求S1中与字符串S2完全匹配的部分,例如: S1 = "ababaababc" S2 = "ababc" 那么得到匹配的结果是5( ...
- URAL 1732 Ministry of Truth(KMP)
Description In whiteblack on blackwhite is written the utterance that has been censored by the Minis ...
随机推荐
- sql 表中删除字段重复的行
Id Email UserName1 Taiseer.Joudeh@hotmail.com TaiseerJoudeh2 Hasan.Ahmad@mymail.com ...
- 1.python虚拟环境的安装-用以同时使用py2,py3
第一步:安装环境支持[linux下在前加sudo] http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl pip install virtualenv 第 ...
- 任务调度工具 Apache Airflow 初识
参考文章: Apache Airflow (incubating) Documentation — Airflow ... 任务调度神器 airflow 之初体验 airflow 介绍 - 简书(原文 ...
- 以太坊智能合约介绍,Solidity介绍
以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...
- 自学Java第五周的总结
在这周里我在我要自学网上观看视频学习了有关java的基础知识,课程主要介绍JavaSE,这是整个Java体系的基础:课程将由浅入深,并结合案例进行讲解,在那里我将自己已学的知识进行了巩固,并由学习到了 ...
- The Little Prince-11/28
The Little Prince-11/28 Today I find some beautiful words from the book. You know -- one loves the s ...
- IP代理
import requests # 定义爬取url地址 base_url = 'https://www.baidu.com/' # 定义代理IP地址 proxies = {'http':'http:/ ...
- Errors occurred during the build. Errors running builder 'Validation' on pro
选择项目-->右键-->Properties-->Builders 右面有四个选项,把Validation前面勾去掉
- log4j2笔记 #03# PatternLayout
该类的目标是格式化LogEvent并返回(字符串)结果.结果的格式取决于具体的模式字符串(pattern string).这里的模式字符串与c语言中printf函数的转换模式非常相似.模式字符串由“转 ...
- mysql执行计划查看工具explain
在优化sql语句时,我们经常会用到explain语句,这里对explain语句做一个详细的总结说明. The EXPLAIN statement provides information about ...