HDU--1358--KMP算法失配函数getfail()的理解--Period

/*
    Name: hdu--1358--Period
    Author: 日天大帝
    Date: 20/04/17 10:24
    Description: 长度/向后移动的位数 = 出现的次数
                kmp其实匹配到了第str.size()位,这一位原本是‘\0‘的,
                但是由于里面的递推下一位的关系,这一位其实也是匹配了的;
*/
#include<iostream>
#include<cstring>
using namespace std;
void getfail(string);
int f[1000009];
int main(){
    int n,k = 0;
    ios::sync_with_stdio(false);//加上之后少了0.5s    700ms-200ms
    while(cin>>n,n){
        string str;cin>>str;
        getfail(str);
        cout<<"Test case #"<<++k<<endl;
        for(int i=2; i<=str.size(); ++i){ // 注意i=str.size()
            if(f[i] > 0 && i%(i-f[i]) == 0){//(i-f[i])是KMP失配函数计算后失配时,向后移动的位数
                cout<<i<<" "<<i/(i-f[i])<<endl;
            }
        }
        cout<<endl;
    }
    return 0;
}
void getfail(string s)
{
    memset(f,0,sizeof(f));  //根据其前一个字母得到
    for(int i=1;i<s.size();i++)
    {
        int j=f[i];
        while(j && s[i]!=s[j])
            j=f[j];
        f[i+1]=(s[i]==s[j])?j+1:0;
    }
}
时间: 2024-08-06 18:24:53

HDU--1358--KMP算法失配函数getfail()的理解--Period的相关文章

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

KMP算法的基本操作和自我理解

1.1 KMP所需要的解决的问题 KMP,是三个人名字的总和缩写.它主要解决的问题就是字符串匹配问题.即给出一个一定长度的字串和一个文本,要求你找出这个字串在文本中出现第一次的位置,然后字串和文本的长度可能很大. 如这样一个题:POJ-3461 题意大概就是找出第一个字符串在第二个字符串中出现次数. 1.2 传统暴力算法 暴力算法就是,通过暴力搜索,从第一个字母开始匹配.如果不匹配,那么就将整个字串往后移动一位.再重新进行匹配.这样的算法(On^2)显然在一些情况下复杂度会变得不可承受.但是我们

HDU 2112 HDU Today &lt;SPFA算法+map函数&gt;

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19826    Accepted Submission(s): 4671 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

HDU 1358 (KMP)

Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5859    Accepted Submission(s): 2844 Problem Description For each prefix of a given string S with N characters (each character has an ASCI

hdu 1358 KMP next数组的运用

题意:给一个字符串,从第二个字符开始,判断前面的是不是循环串,是的话就输出当前位置和循环次数. 考的是对于next数组的理解和灵活运用,字符编号从0开始,那么if(i%(i-next[i])==0),则i前面的串为一个循环串,其中循环子串出现i/(i-next[i])次. 1 #include<iostream> 2 #include<string> 3 #include<string.h> 4 #define MAX_N 1000005 5 6 using names

KMP算法具体解释(转)

作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解说KMP算法的时候,言语磕磕碰碰,我想,原因有二:1.博客内的东西不常回想,忘了不少:2.便是我对KMP算法的理解还不够彻底,自不用说解说自如,运用自如了.所以,特再写本篇文章.因为此前,个人已经写过关于KMP算法的两篇文章,所以,本文名为:KMP算法之总结篇. 本文分为例如以下六个部分: 第一部分

[转]KMP算法

KMP字符串模式匹配详解 分类: 算法 2013-02-12 19:26 2380人阅读 评论(0) 收藏 举报 个人觉得这篇文章是网上的介绍有关KMP算法更让人容易理解的文章了,确实说得很“详 细”,耐心地把它看完肯定会有所收获的--,另外有关模式函数值next[i]确实有很多版本啊,在另外一些面向对象的算法描述书中也有失效函数 f(j)的说法,其实是一个意思,即next[j]=f(j-1)+1,不过还是next[j]这种表示法好理解啊: KMP字符串模式匹配详解 KMP字符串模式匹配通俗点说

[hiho 03]KMP算法

题目描述 暴力解法:枚举原串起始位置,逐个匹配,复杂度O(mn). 优化思路:失配时,前面已匹配的字符可以提供信息. KMP算法: 对于模式串任意位置 i ,如果我们知道一个 k 使得 i 位置前的 k 个元素和模式串最开始的前 k 个元素一一相等,那么第 i 个元素失配时就可以之间从第 k + 1 个元素开始继续匹配,这就利用到了失配前的匹配信息. 于是我们想构造这样一个数组 next_val[]  使得 next_val[i] 指向第 i 元素失配时下一个匹配的位置. 例如对于模式串abca

【数据结构与算法】字符串匹配KMP算法

首先需要了解一下BF暴力匹配算法,这个算法为每一个串设置一个指针,然后两个指针同时后移,出现不匹配的情况后,主串指针回到开始后移之前的位置的下一位,模式串指针回到最开始. 对比一下KMP算法,同样是设置两个指针,然后两个指针同时后移,出现不匹配的情况后,主串指针不变,模式串指针回溯一定的距离.具体模式串指针回溯多少,是第一次看KMP算法的人比较难以理解的,其实仔细想想,模式串的前缀和后缀其实也是在做匹配,当P[K]!=P[J]时就是失配,那么前缀的指针就需要回溯,所以后k=next[k]. 代码