KMP算法,Next跳转表的应用(1)
来源:互联网 发布:软件测试技术考题 编辑:程序博客网 时间:2024/06/07 15:50
题目:
定义一个字符串间的运算符 “*”: a=’abc’; b = “def” -> a*b = “abcdef”;
a^0 = “” (空字符串)
a^(n+1) = a*a^n
现输入一系列的字符串,求对于输入的字符串s,是否存在一个s的子串a,使得 s = a^n; 若存在,求出最小长度的a,以及对应的n的值,此时n应该达到最大值。
分析:
首先,在最不理想的状态下: s = s^1 ,即n的最小值为0;
其次,若存在一个子串 a满足条件: 则有 a+a+a……+a (n 个a) = s
回顾KMP算法中next[]跳转表的含义,此时可以有 next[len(s)] = len(a)*(n-1) (其中len(a)为求字符串a的长度)
此时可以得到n的值为 len/ (len(s) - next(len[s]))
另外,上式必须能够整除,所以我们可以将 条件 len% (len(s) - next(len[s])) == 0 作为判断是否满足条件(1)的判别式!
C++ 代码实现:
#include <iostream>#include <string>using namespace std;#define MAX_LEN 1005 // 假设最长字符串为 1000int next[MAX_LEN];int len;int get_next(string &p){ next[0] = -1; int i = 0; int j = -1; while(i<=len) // len 为字符串的长度 { while( j ==-1 || (i<len && p[i]== p[j])) { //cout<<j; i++; j++; next[i] = j; } j= next[j]; } return 0;}int main(){ string str; while( cin>>str ) { len = str.length(); get_next(str); if( (len%(len-next[len]) == 0)) cout<< len/(len-next[len])<<endl; else cout<< 1; } return 0;}
注:翻译转载!
2016-5-24
TJU-26E
0 0
- KMP算法,Next跳转表的应用(1)
- KMP算法中的NEXT数组的应用
- KMP算法,关键在于next表的构建
- POJ 2752 KMP算法中next数组的应用
- poj 1961 kmp算法之next数组的意义应用
- [kmp算法next数组的应用][poj1961]Period
- KMP算法-next数组的应用-循环节问题
- poj2406--kmp next的应用
- kmp算法(字符串匹配 next应用 hdu题目集合)
- HDU 3336 Count the string(KMP算法next数组的应用)
- KMP算法的next数组
- KMP算法的next详解
- KMP算法next的求法
- KMP算法next的变形
- poj2406-kmp的next数组的简单应用(2)
- poj1961-kmp的next数组的简单应用(2)
- POJ2185-Milking Grid(KMP,next数组的应用)
- hdu 4763 Theme Section (kmp, Next数组的应用)
- python正则表达式
- Tabhost使用
- Android 四大组件——广播接收器 详解
- jdbc数据库连接池
- 解决php5.6连接64位系统下mssql2008的错误问题
- KMP算法,Next跳转表的应用(1)
- SNMP4j实现同步和异步的GET的示例
- 双剑合并 XOR Trie.
- hdu 1754 线段树
- JMeter压力测试入门教程
- 使用try-with-resource改进代码异常处理机制
- DB2 清空数据表
- Android总结篇
- 锚点伪类改善点击时按钮状态交互细节(使用:active实现)