题意

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

最新文章

  1. [LeetCode] Design Twitter 设计推特
  2. 搭建Git服务器
  3. Socket小项目的一些心得(鸣谢传智的教学视频)
  4. 通过缓存数据库结果提高PHP性能(转)
  5. 两种Makefile
  6. java.lang.ClassCastException: sun.proxy.$Proxy11 cannot be cast to分析
  7. c#-RTF文本编辑器
  8. 【高德API】如何利用MapKit开发全英文检索的iOS地图
  9. 设置debian的静态IP
  10. SSH中的免password登录
  11. JAVA 集合 按照某个字段(依据一定条件)进行分组
  12. Windows Server 2016-清理残留域控信息
  13. Java Web(三) Servlet会话管理
  14. PHP实现防sql注入
  15. Method not found: &#39;System.Data.Entity.ModelConfiguration.Configuration.XXX
  16. SQL操作查漏补缺
  17. 【Spring源码分析系列】结构组成和容器的基本实现
  18. html模板生成静态页面及模板分页处理
  19. 51Nod:活动安排问题之二(贪心)
  20. github pages 正确访问方式

热门文章

  1. DSO安装试运行
  2. 什么是UTF-8
  3. seo网页加速技术,预加载 DNS Prefetching 详解
  4. 【JavaScript 6连载】三、构造函数
  5. nginx实现MySQL负载均衡
  6. SQL Server 2008 R2 常用系统函数学习
  7. Spring Aop 代理
  8. JS笔记—01
  9. ltp执行过程总结
  10. window JNI_CreateJavaVM启动java程序