hdu4763
来源:互联网 发布:java毕业论文开题报告 编辑:程序博客网 时间:2024/06/09 14:55
对于初学KMP的简单记录就从本题开始,题目大意是给你已给串,让你去找到一个子串,使得子串的与该串的前缀和后缀串相等,且三个串不重复。
简单分析:此题其实是要求对KMP的next数组有深刻的认识,通过自己匹配自己,求出next数组,代表了前i的字符前缀和后缀相等的最长长度,因此在计算出next数组后只需从len-1开始查找是否满足前缀等于前len-1个串的后缀,并且满足原串的后缀,因此需要在用一个数组fg标记一下远串后缀能达到的长度,切让他满足和原串前缀相等,标记过程就是利用next数组的值,从后面玩前面递归,标记好后就可以从前len-1开始暴力求解了。
代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 1000005int f[N];char s[N];bool fg[N];void getFail(char *p){ f[0]=f[1]=0; for(int i=1;p[i];i++) { int j=f[i]; while(j&&p[i]!=p[j]) j=f[j]; if(p[i]==p[j]) f[i+1]=j+1; else f[i+1]=0; }}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%s",s); getFail(s); int n=strlen(s); int team=n; memset(fg,false,sizeof(fg)); while(team>0) { if(n>=2*team)fg[team]=true; team=f[team]; } int ans=0; for(int i=n-1;i>1;i--) { team=i; while(team>0) { if(fg[team]&&i>=2*team&&n>=i+team) { ans=max(ans,team); break; } team=f[team]; } } printf("%d\n",ans); } return 0;}
0 0
- hdu4763
- hdu4763
- hdu4763 Theme Section KMP
- hdu4763 Theme Section (KMP)
- hdu4763(kmp水题)
- HDU4763 Theme Section 【KMP】
- hdu4763---Theme Section
- HDU4763 Theme Section KMP
- hdu4763 扩展kmp
- hdu4763(kmp)
- hdu4763 扩展KMP
- HDU4763 Theme Section
- HDU4763 - Theme Section(KMP)
- hdu4763 Theme Section(kmp)
- hdu4763(KMP的应用)
- Theme Section(KMP应用 HDU4763)
- HDU4763-Theme Section(KMP+二分)
- hdu4763 Theme Section(KMP水题)
- hadoop笔记(1)——安装 单机版
- Android WebView 开发详解(二)
- 分页
- 数据存储的使用
- 正则表达式
- hdu4763
- 背景图以拉伸方式(不重复)填充背景
- java 常用的Java片段
- windows驱动编程学习路线
- error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found
- Leetcode -- Plus One
- Android开发之屏幕大小自适应
- leetcode Single Number以及扩展
- 在MySQL中存储二维Excel表示的方法