hdu4763 扩展kmp
2015-11-18 23:55
253 查看
题意是在一个字符串中找出一个前缀一个后缀和一个中间的子串,互相不重叠并且三部分完全一样
运用的是exKMP
对自身求一个next数组
next[i]表示以i为开始位置的子串与整个串的前缀最长匹配到多少长度
然后就是枚举了
注意到我们枚举后三分一的位置时,如果某个位置为i,
且next[i]+ i == len。
也就是子串的长度为next[i]了
运用的是exKMP
对自身求一个next数组
next[i]表示以i为开始位置的子串与整个串的前缀最长匹配到多少长度
然后就是枚举了
注意到我们枚举后三分一的位置时,如果某个位置为i,
且next[i]+ i == len。
也就是子串的长度为next[i]了
// Created by Chenhongwei in 2015. // Copyright (c) 2015 Chenhongwei. All rights reserved. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <climits> #include <queue> #include <cmath> #include <map> #include <set> #include <stack> #include <vector> #include <sstream> #include <algorithm> #include <ctime> using namespace std; const int inf=1e9; const int maxn=1e6+100; typedef long long ll; typedef unsigned long long ull; char t[maxn]; int nxt[maxn]; void pre_exkmp(char *t) { int n=strlen(t); nxt[0]=n; int j=0; while(j+1<n&&t[j+1]==t[j]) j++; nxt[1]=j; int a=1,p,l; for(int i=2;i<n;i++) { p=a+nxt[a]-1; l=nxt[i-a]; if(i+l<p+1) nxt[i]=l; else { j=max(0,p-i+1); while(i+j<n&&t[i+j]==t[j]) j++; nxt[i]=j; a=i; } } } int main() { //ios::sync_with_stdio(false); // freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int T; scanf("%d",&T); while(T--) { scanf("%s",t); int len=strlen(t); pre_exkmp(t); int ans=0,mlen; for(int i=2*len/3;i<len;i++) { if(i+nxt[i]!=len) continue; ans=nxt[i]; break; } printf("%d\n",ans); } return 0; }
相关文章推荐
- 在Ubuntu中安装并测试OpenCV
- 备忘录--关于线程和IO知识
- How to use VideoToolbox to decompress H.264 video stream
- poj 2273 An Excel-lent Problem 类进制转换
- android下的样式
- 昌大软院大神养成计划之网页设计之路第一天
- 为什么一个数的各位数之和可以被3整除时,这个数就可以被3整除
- setiosflags() 的好处多多
- 文件属性与权限的更改
- Java写入文件的几种方法小结
- 【转】浅谈C#委托和事件
- dynamic结合匿名类型 匿名对象传参
- 编程基础知识之函数多返回值
- 【C语言】【面试题】【笔试题】模拟实现数据库中strcpy函数
- Linux用cmake编译c++
- couple
- Tomcat基础配置说明
- 提升Java性能的基本方法
- lua 开发学习之旅三
- 自定义流式布局(应用:热门标签,照片)