HDU4763 Theme Section KMP-next应用
2016-03-26 13:24
176 查看
题意:给你一个字符串,若将它分割成 AXAXA 的形式,A最长是多少?
思路:对于这道题我看了很多题解,但感觉讲的还是很模糊,这道题从next数组入手即可,很短的代码便可搞定,主要要了解一点如果给你一个长度为n的字符串,那么前后缀的最大匹配值自然是next
,那么次长前后缀匹配值是什么呢? 其实就是next[ next
] ,我们可以通过找出前后缀的匹配值然后知道中间子串的上下界,然后再这个区间看能否找到子串即可,若不能,换成次长前后缀匹配继续求解,以此类推。
代码如下:
思路:对于这道题我看了很多题解,但感觉讲的还是很模糊,这道题从next数组入手即可,很短的代码便可搞定,主要要了解一点如果给你一个长度为n的字符串,那么前后缀的最大匹配值自然是next
,那么次长前后缀匹配值是什么呢? 其实就是next[ next
] ,我们可以通过找出前后缀的匹配值然后知道中间子串的上下界,然后再这个区间看能否找到子串即可,若不能,换成次长前后缀匹配继续求解,以此类推。
代码如下:
#include <bits/stdc++.h> using namespace std; const int maxn=1e6+5; char p[maxn]; int NEXT[maxn]; void get_NEXT(){ NEXT[0] = -1; int k = -1; int j = 0; int n = strlen(p); while(j < n){ if(k == -1 || p[k] == p[j]){ k++; j++; NEXT[j] = k; } else k = NEXT[k]; } } int main() { ios::sync_with_stdio(false); int T; cin>>T; while(T--){ cin>>p; get_NEXT(); int n = strlen(p); int F = NEXT ; int ans = 0; for(int i=F;i>0;i=NEXT[i]){ for(int j=i;j<=n-i;j++){ if(NEXT[j] == i){ ans=i; goto stop; } } } stop: cout<<ans<<endl; } return 0; }
相关文章推荐
- 初学Redis(2)——用Redis作为Mysql数据库的缓存
- 自定义dialog
- 中缀表达式求值
- Apache Cordova开发环境搭建(一)-Visual Studio
- Java配置jdk图文教程
- 【Unity】2.2 Unity编辑器中的常用菜单项
- 18--26 面向对象程序设计24(深入解析原型继承的概念)
- 制作Ubuntu server 12.04及新版系统安装U盘的正确方法
- python 输出冒号;引号嵌套问题
- codeforces 652B B. z-sort(水题)
- java日期时间Date类
- CDN 技术研究——总概篇
- 题目1001:A+B for Matrices
- 在云中生成和模拟 iOS
- Linux网络配置基础篇
- 文件操作
- codeforces 652D D. Nested Segments(离散化+sort+树状数组)
- linex下部署发布web项目
- Fedora23Server配置
- 求一个整数数组中最大子数组的和