POJ 1961 KMP(当前重复次数)
来源:互联网 发布:3d二次元制作软件 编辑:程序博客网 时间:2024/05/14 07:49
题意:
前缀重复次数,举个例子,aaa 2的位置2个a,3的位置3个a
abcabcabc 6的位置两个abcabc,9的位置三个abcabc....
思路:
KMP基础题目之一,直接利用的是next数组的特点,对于当前点i,
前缀重复次数,举个例子,aaa 2的位置2个a,3的位置3个a
abcabcabc 6的位置两个abcabc,9的位置三个abcabc....
思路:
KMP基础题目之一,直接利用的是next数组的特点,对于当前点i,
i - next[i] 表示的是最小重复子串长度,如果 i - next[i] 不等于0,同时i % (i - next[i]) == 0说明当前字符是循环子串的最后一位,那么tmp = i / (i - next[i]) 表示的是循环次数,如果tmp>1直接输出i i / (i - next[i])就行了,就说这么多吧,只要理解了next数组就肯定会这个题目了。
#include<stdio.h>#include<string.h>#define N 1000000 + 100int next[N];char str[N];void get_next(int m){ int j ,k; j = 0 ,k = -1; next[0] = -1; while(j < m) { if(k == -1 || str[j] == str[k]) next[++j] = ++k; else k = next[k]; } return ;}int main (){ int m ,i ,cas = 1; while(~scanf("%d" ,&m) && m) { scanf("%s" ,str); get_next(m); printf("Test case #%d\n" ,cas ++); for(i = 1 ;i <= m ;i ++) { if(i - next[i] && i % (i - next[i]) == 0) { int tmp = i / (i - next[i]); if(tmp > 1) printf("%d %d\n" ,i ,tmp); } } printf("\n"); } return 0;}
0 0
- POJ 1961 KMP(当前重复次数)
- POJ-1961 Period-KMP前缀串重复次数
- POJ-2406 Power Strings(KMP求重复子串出现的最大次数)
- poj3641(KMP求子串重复次数)
- poj2752 kmp 最短子串重复次数
- POJ 1961(KMP前缀最长重复子串)
- kmp(第二次个人赛)*(重复次数->长度最长)
- poj 2406 Power Strings (最小重复子串出现次数 kmp)
- POJ 1961 KMP 求前缀循环节 位置及次数
- POJ 3461 Oulipo(KMP求匹配次数)
- poj 2406 Power Strings(KMP求循环次数)
- POJ 3461 Oulipo(KMP统计子串出现次数)
- KMP求最小重复子串的重复次数(poj2406)
- POJ-1961(KMP)
- POJ 1961 (KMP)
- POJ 1961 (KMP)
- KMP求最长连续重复字串——POJ 1961
- poj 1961 Period (最小重复子串 kmp)
- 编辑文章 - 博客频道 - CSDN.NET
- ASP.NET操作Oracle数据库方法
- OC中的属性特性(Property)
- 使用VB开发SQL Server应用程序
- DataStage Job优化指导原则
- POJ 1961 KMP(当前重复次数)
- 黑马程序员_交通灯管理系统
- C++ Primer的一小点总结
- linux 系统调用实验
- Linux 编译jrtplib-3.9.1 jthread-1.3.1
- 允许 MySQL 以 root 用户远程登陆
- VS2010 动态库开发——第一章演练:创建和使用动态链接库 (C++)
- 菜鸟的自白
- 设计模式-小结-2