题意

给定一个字符串 \(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;
}

转载于:https://www.cnblogs.com/Paulliant/p/10204808.html

LightOJ 1258 Making Huge Palindromes(KMP)相关推荐

  1. JavaScript实现knuth-morris-pratt(KMP)算法(附完整源码)

    JavaScript实现knuth-morris-pratt(KMP)算法(附完整源码) knuthMorrisPratt.js完整源代码 knuthMorrisPratt.test.js完整源代码 ...

  2. Oulipo(kmp)

    Oulipo(kmp) The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...

  3. 杭电ACM-LCY算法进阶培训班-专题训练(KMP)

    杭电ACM-LCY算法进阶培训班-专题训练(KMP) 杭电ACM-LCY算法进阶培训班-专题训练(KMP) 剪花布条 Problem Description Input Output Sample I ...

  4. Python:实现knuth morris pratt(KMP)算法(附完整源码)

    Python:实现knuth morris pratt(KMP)算法 from __future__ import annotationsdef kmp(pattern: str, text: str ...

  5. 第四章:2.串 -- 串的模式匹配算法(KMP)

    前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 ...

  6. LeetCode 1392. 最长快乐前缀(KMP)

    1. 题目 「快乐前缀」是在原字符串中既是 非空 前缀也是后缀(不包括原字符串自身)的字符串. 给你一个字符串 s,请你返回它的 最长快乐前缀. 如果不存在满足题意的前缀,则返回一个空字符串. 示例 ...

  7. 字符串匹配算法(KMP)

    文章目录 1. KMP由来 2. KMP算法基本原理 3. 代码 4. Leetcode 28. 实现 strStr() 1. KMP由来 上一节说的BM算法是最高效.最常用的字符串匹配算法. 最知名 ...

  8. 字符串的模式匹配(KMP)算法

    一.背景 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的常 ...

  9. Knuth-Morris-Pratt算法(KMP)

    Knuth-Morris-Pratt 字符串查找算法(常简称为 "KMP算法")是在一个"主文本字符串"S 内查找一个"词"W 的出现,通过 ...

  10. codeforce No to Palindromes!(枚举)

    1 /* 2 题意:给定一个字符串中没有任何长度>1的回文子串!求按照字典序的该串的下一个字符串 3 也不包含长度>1的任何回文子串! 4 5 思路:从最低位进行枚举,保证第i位 不与 第 ...

最新文章

  1. 神操作!一行Python代码搞定一款游戏?给力!
  2. Extjs4 MVC 示例
  3. 使用scanf()函数接收带空格的字符串
  4. 趁有空,再了解一下GROOVY中关于类的通例
  5. 牛客 - 牛牛的Link Power II(线段树)
  6. java 秒杀多线程_秒杀多线程系列 - 随笔分类 - Joyfulmath - 博客园
  7. 偏移出来的数据不准_关于AD7616采集后读回来数据不准(有偏移)的问题
  8. nginx配置虚拟主机-端口号区分/域名区分
  9. linux hal 结构图
  10. C语言视频教程-谭浩强版-小甲鱼主讲—P2
  11. html编写一个飞机游戏,利用HTML5 Canvas如何制作一个简单的打飞机游戏
  12. 【我的OpenGL学习进阶之旅】什么是PVR文件以及如何打开它?
  13. 菜 根 谭 [明] 洪应明
  14. 商战传奇:周鸿祎死磕雷军的背后的三重玄机
  15. ndims matlab,MATLAB的size(),length(),ndims()函数
  16. js根据IP地址获取当前的省市
  17. html5诊断报告,网站诊断报告(模板).doc
  18. QtCreator添加文件夹
  19. win10最简单的C盘清理,亲测有效
  20. USDCNY即期均值顺势信号——基于Python的均值回归进阶策略

热门文章

  1. Spring Boot 2.3 优雅停机来了,新特性真香!!
  2. Tomcat爆出严重漏洞,影响所有版本,波及约8万台服务器,附解决方案!(扩散!!!)...
  3. 关于Spring,所有的都在这了,具有收藏价值
  4. 华为:行业危机时,只做一件事:抢人!
  5. Python3选择支持非ASCII码标识符的缘由
  6. 拦截导弹 (最长上升子序列LIS)
  7. SAStruts中文文档
  8. [DELPHI]数据类型
  9. Interesting Finds: 2008.01.04
  10. CString Char* 转换 - C++学习