poj1961 kmp
题目大意,求这个字符串到i为止有多少个循环串;
int k = i-next[i];
if((i+1)%k == 0 && (i+1)!= k)
printf("%d %d\n", i+1, (i+1)/k);
这是代码的主要部分,求next数组的部分大家都知道,我来说说这部分的正确性;
例如一个字符串的第99为指向第96位,也就是说后4-99位和前1-96位是匹配的,就是说94到96与97到99是是匹配的;
而且91-94与94-96是匹配的。。。。。。。。。。。
一直可以推到最前面,以上就是正确性啦~
上代码
#include <iostream>
#include <string.h>
#include <map>
#include <stdio.h>
using namespace std;
const int maxa =1000005;
int next[maxa];
int vis[maxa];
int n;
void init_kmp(char str[])
{
memset(vis, 0, sizeof(vis));
next[0]=-1;
for(int i=1;str[i]!=0;i++)
{
int j= next[i-1];
while(str[j+1]!=str[i]&&j>=0)
j= next[j];
if(str[j+1] == str[i])
next[i] = j + 1;
else
next[i] = -1;
}
}
int main(){
char str[maxa];
int d =1;
while(scanf("%d", &n), n){
scanf("%s", str);
printf("Test case #%d\n", d++);
init_kmp(str);
for(int i = 0; i < n; i++){
int k = i-next[i];
if((i+1)%k == 0 && (i+1)!= k)
printf("%d %d\n", i+1, (i+1)/k);
}
printf("\n");
}
}
poj1961 kmp的更多相关文章
- POJ1961 KMP算法
POJ1961 问题重述: 输入一个长度为l的字符串S,求所有S的由字串重复排列而成的前缀,并输出前缀的长度以及该前缀的最大重复度. AC代码: //Memory: 5700K Time: 641MS ...
- POJ1961[KMP 失配函数]
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 16776 Accepted: 8077 Descripti ...
- poj1961 Period kmp解决找字符串的最小循环节
/** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个 ...
- [POJ2406&POJ1961]用KMP解决字符串的循环问题两例
翻阅了一下网上资料,发现大部分都说这题是找规律...或是说YY出的一个算法..不会证明... 然后就脑补了一下证明 ~ 结论:对于一个字符串S[1..N],如果N mod (N-next[N])=0 ...
- poj1961(kmp算法next数组应用)
题目链接:https://vjudge.net/problem/POJ-1961 题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i) ...
- [POJ1961]Period (KMP)
题意 求字符串s的最小循环元长度和循环次数 思路 s[1~i]满足循环元要len能整除i并且s[len+1~i]=s[1~i-len] 代码 #include<cstdio> #inclu ...
- poj1961 & hdu1358 Period【KMP】
Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 20436 Accepted: 9961 Descripti ...
- 【POJ1961 Period】【KMP】
题面 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如"abaab"共有5个前缀,分别是a, ab, aba, abaa, abaab. 我们希望知道一个N位字符串S的前缀 ...
- 【POJ1961】最短周期串/最大周期 kmp
引理:\(s[1,i]\) 具有长度为 \(len\) 的循环节的充要条件是:\(len\ |\ i,s[1,i-len]=s[len+1,i]\). 代码如下 #include <cstdio ...
随机推荐
- pythond对象、异常、反射的学习笔记
python多继承,刚开始我是表示惊讶的,毕竟学的php,哪来的多继承?顶多也就是利用接口模拟多继承后者使用反射机制实现.那么还是来看看python的强大吧 1 首先,Python的类继承了多个类,那 ...
- php中文匹配
PHP判断字符串中是否含有中文 <? $str = "测试中文"; echo $str; echo "<hr>"; //if (preg_ma ...
- php 编码规范(1)
1. 包含尽量不要使用短标签例如 <? #coding ?> 2. 忽略结束标签,防止其他字符或者空格影响到代码 <?php$foo = 'foo'; 如果不开启压缩或者缓存输出时候 ...
- 在选择“Add Library Package reference”时提示:无法加在一个或多个请求的类型,有关更多信息,请检索LoaderException属性
- MSP430 中断优先级
MSP430的中断优先级.打开关闭.中断嵌套 优先级顺序从高到低为: PORT2_VECTOR (1 * 2u) /* 0xFFE2 Port 2 */ PORT1_VECTOR (4 * ...
- MLlib 卡方检验
1.卡方检验理论 1.1. 简介 总体的分布函数完全未知或只知形式.但不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设.我们要根据样本对所提出的假设作出是接受,还是拒绝的决策.假 ...
- Android addView动态给Activity添加View组件
本文主要讲述如何动态给UI界面添加布局和控件,在编程的时候很多时候需要动态显示一些内容,在动态添加View的时候,主要使用addView方法. 1. addView方法简介 在Android 中,可以 ...
- VMware migration to openstack kvm
- Uber明年在中国将继续补贴,并大举进军100个城市!
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Objective-C基础学习笔记——对象初始化
obj中创建新对象有两种方式:[classname new]和[[classname alloc] init].两种方法等价,Cocoa惯例是使用alloc和init. 1.分配对象: allocat ...