poj2406(kmp算法)
Input
Output
Sample Input
abcd
aaaa
ababab
.
Sample Output
1
4
3
Hint
大意:给出一个字符串 问它最多由多少相同的字串组成 (转载自https://www.cnblogs.com/zhanzhao/p/4761477.html)
如 abababab由4个ab组成
分析:
kmp中的next数组求最小循环节的应用
例如
ababab next[6] = 4; 即
ababab
ababab
1~4位 与2~6位是相同的
那么前两位
就等于3、4位
3、4位就等于5、6位
……
所以 如果 能整除 也就循环到最后了
如果不能整除
就最后余下的几位不在循环内
例如
1212121
1212121
最后剩余1不能等于循环节
#include<stdio.h>
#include<string.h>
char str[1000005];
int next[1000005];
int main ()
{
int i ,n;
while(scanf("%s" ,str)!=EOF && str[0] != '.')
{
//printf("WWW\n");
n = strlen(str);
int k = -1;
next[0] = -1;
for(i=1;i<n;i++)
{
//printf("%d %d\n",i,k);
while(k>-1&&str[k+1]!=str[i])
{
//printf("%d %c %c\n",k,str[k],str[i]);
k=next[k];
}
if(str[k+1]==str[i])
k++;
next[i]=k;
}
int t=next[n-1]+1;
if (n % (n-t)==0) printf("%d\n", n / (n-t));
else printf("%d\n", 1);
}
return 0;
}
此代码核心的另一种写法(大同小异)
int k = -1;
int j = 0;
next[0] = -1;
while(j<n)
{
//printf("%d %d\n",i,k);
if(k==-1||s[j] == s[k])
{
next[++j]=++k;
}
else
k=next[k];
}
我卡bug的代码
n = strlen(str); //这代码咋一看没有错误,但是仔细观察后会发现当输入数据为aabbaa时这个代码会卡死,原因是当i=2时
int k = 0;
next[0] = 0;
for(i=1;i<n;i++)
{
//printf("%d %d\n",i,k);
while(k>0&&str[k]!=str[i])//这个while语句会陷入死循环
{
//printf("%d %c %c\n",k,str[k],str[i]);
k=next[k];//k=next[k]=1,在这种情况下会一直执行这个while语句,睡完午觉后才突然发现。。。。,
}
if(str[k]==str[i])
k++;
next[i]=k;
}
总之,以后打代码不能总是只考虑到一种可能出错的方式,要看看自己的代码是否会卡在某些特殊数据上,如果遇到错误千万不能心急,首先要冷静下来,仔细看看自己的代码可能出错的地方,可能会发生错误的地方和数据,只有这样才能高效的找出问题的所在!!!
poj2406(kmp算法)的更多相关文章
- POJ2406 KMP算法
POJ2406 问题重述:给定字符串s0,记连续的k个s前后相连组成的s0s0...s0为s0^k.输入字符串S,求最大的k,使得S = s0^k. 问题分析: 1.采用kmp算法求出前缀函数 pre ...
- POJ2406 kmp算法next数组-串的最小循环节/循环周期
题目链接:http://poj.org/problem?id=2406 题目大意:问给出的字符串最多由多少个子串相乘得来的. 思路:利用next数组的含义来解. 1.一个串的最小循环节长度:len - ...
- HihoCoder第三周与POJ2406:KMP算法总结
HihoCoder第三周: 输入 第一行一个整数N,表示测试数据组数. 接下来的N*2行,每两行表示一个测试数据.在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不 ...
- KMP算法及KMP算法的应用(POJ2406)
///KMP算法#include<bits/stdc++.h> using namespace std; ]; void makeNext(const char P[],int next[ ...
- KMP算法复习【+继续学习】
离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- KMP算法
KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- KMP算法实现
链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...
随机推荐
- hdu-6194 string string string 后缀数组 出现恰好K次的串的数量
最少出现K次我们可以用Height数组的lcp来得出,而恰好出现K次,我们只要除去最少出现K+1次的lcp即可. #include <cstdio> #include <cstrin ...
- 配置Tomcat配置路径
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDepl ...
- Confluence 6 为一个空间应用一个主题
主题允许你对 Confluence 的外表和显示进行自定义.你的 Confluence 空间管理员可以到 The Atlassian Marketplace 上下载主题. 一旦一个主题被安装到 Con ...
- PHP多种序列化/反序列化的方法(serialize和unserialize函数)
serialize和unserialize函数 这两个是序列化和反序列化PHP中数据的常用函数. <?php $a = array('a' => 'Apple' ,'b' => 'b ...
- Linux 文本编辑器 vim
第五讲 文本编辑器 vim
- php 常用函数总结
1. is_numeric() // 判断变量是不是数字或者数字字符串 2. array_column() // 获取某一列 3. array_search() // array_search(val ...
- python 常用代码
获取标签名 h1 class 是h1usersoup.find(name="h1", attrs={"class":"h1user"});获 ...
- express文件上传中间件Multer详解
express文件上传中间件Multer详解 转载自:https://www.cnblogs.com/chengdabelief/p/6580874.html Express默认并不处理HTTP请 ...
- [CodeForces - 614C] C - Peter and Snow Blower
C - Peter and Snow Blower Peter got a new snow blower as a New Year present. Of course, Peter decide ...
- [CodeForces - 197F] F - Opening Portals
F - Opening Portals Pavel plays a famous computer game. A player is responsible for a whole country ...