<html>

A - KMP模式匹配 一(串)
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

求子串的next值,用next数组存放。所有输出

Input

输入一个字符串

Output

输出全部next值

Sample Input

abaabcac

Sample Output

0 1 1 2 2 3 1 2

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char s[100];
    cin>>s;
    int suffix[100];
    int len=strlen(s);
    int pos=0;
    suffix[0]=-1;
    suffix[1]=0;
    for(int i=2;i<=len;++i){
        while(pos>=0&&s[pos]!=s[i-1])
            pos=suffix[pos];
        suffix[i]=++pos;
    }
    int i=1;
    cout<<suffix[0]+1;
    while(i<strlen(s)){
    cout<<' '<<suffix[i]+1;
    i++;
    }
    return 0;
}

B - KMP模式匹配 二(串)
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成功,则输出0

Input

输入一个主串和一个子串

Output

匹配的趟数

Sample Input

ababcabcacbab
abcac

Sample Output


3

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char s[100];
    char b[100];
    cin>>b;
    cin>>s;
    int suffix[100];
    int len=strlen(s);
    int pos=0;
    suffix[0]=-1;
    suffix[1]=0;
    for(int i=2;i<=len;++i){
        while(pos>=0&&s[pos]!=s[i-1])
            pos=suffix[pos];
        suffix[i]=++pos;
    }
    int i=0,j=0;
    int cns=1;
    bool flag=false;
    while(i<strlen(b))
        if(b[i]==s[j]){
            j++;
            i++;
            if(s[j]=='\0'){
                flag=true;
                break;
            }
        }
        else if(suffix[j]==-1){
            i++;
            j=0;
            cns++;
        }
        else {
            j=suffix[j];
            cns++;
        }
   if(flag)cout<<cns<<'\12';
   else cout<<0<<'\12';
    return 0;
}

C - KMP模式匹配 三(串)
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu

Description

输入一个主串和一个子串,若匹配成功,则找出匹配的趟数和在子串在主串中的位置,若匹配不成功,则输出0

Input

输入两个字符串

Output

输出匹配的趟数和位置

Sample Input

ababcabcacbab
abcac

Sample Output

3 6
#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char s[100];
    char b[100];
    cin>>b;
    cin>>s;
    int suffix[100];
    int len=strlen(s);
    int pos=0;
    suffix[0]=-1;
    suffix[1]=0;
    for(int i=2;i<=len;++i){
        while(pos>=0&&s[pos]!=s[i-1])
            pos=suffix[pos];
        suffix[i]=++pos;
    }
    int i=0,j=0;
    int cns=1;
    bool flag=false;
    while(i<strlen(b))
        if(b[i]==s[j]){
            j++;
            i++;
            if(s[j]=='\0'){
                flag=true;
                break;
            }
        }
        else if(suffix[j]==-1){
            i++;
            j=0;
            cns++;
        }
        else {
            j=suffix[j];
            cns++;
        }
   //cout<<"i "<<i<<" j "<<j<<" len "<<strlen(b)<<'\12';
   if(flag)cout<<cns<<' '<<i-j+1<<'\12';
   else cout<<0<<'\12';
    return 0;
}


版权声明:本文为博主原创文章。未经博主同意不得转载。 举报
  • 本文已收录于下面专栏:

相关文章推荐

KMP算法复习及练习

#include #include #include const int N=100; using namespace std; int main() {   char a[N],b[N];...

KMP字符串模式匹配具体解释

KMP字符串模式匹配具体解释 <p class="Ms

【练习03】 KMP 1004 Period

kmp,依次求字符串前缀的最小循环节, AC耗时500ms,可是在statistic里看到有人50msAC, 可能原因: 1.输入输出的优化 2.用了更奇妙的算法。

//模板開始 #inclu...

kmp算法

串行串匹配算法 KMP算法     KMP算法的关键是依据给定的模式串W[1,m],定义一个next函数。next函数包括了模式串本身局部匹配的信息。next函数的定义例如以下:             KMP算法的基本思想是:如果在模式匹配的进程中。运行T[i]和W[j]的匹配检查。若T[i]=W[j],则继续检查T[i+1]和 W[j+1]是否匹配。

若T[i]&lt;&gt;W[j],则分成两种情况:若j=1,则模式串右移一位,检查T[i+1]和W[1]是否匹配;若1&amp; lt;j&lt;=m。则模式串右移

【练习03】 KMP 1001 Number Sequence

非常纯正的KMP。模板函数仅仅需做非常小的修改。仅仅是把char *P, char *T换成int* P和int* T。//模板開始 #include #include #include ...

KMP字符串模式匹配具体解释

个人认为这篇文章是网上的介绍有关KMP算法更让人easy理解的文章了,确实说得非常“具体”,耐心地把它看完肯定会有 所收获的~~,另外有关模式函数值next[i]确实有非常多版本号啊。在另外一些面向对象的算法描写叙述书中也有失效函数 f(j)的说法,事实上是一个意思。即next[j]=f(j-1)+1,只是还是next[j]这样的表示法好理解啊: KMP<span style="font-s

POJ 3461 Oulipo KMP练习

题目链接 题目非常长,事实上就是字符串匹配。 所以,权当练习 KMP #include #include #define MB 10101 #define MA 1000100 char a[MA],...
  • kzzhr
  • kzzhr
  • 2014-03-31 09:34
  • 575

KMP字符串模式匹配具体解释

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位还有一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。

能够证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ],

【练习03】 KMP 1006 Count the string

假设枚举全部前缀而且调用find函数会超时,可是我们思考一下就能发现仅仅要遍历数组f,当f的值非0,count就加1(包含f[n]),最后加上字符串长度n就是终于的结果。

(细致理解) 最后还要注意的是...

[练习]erlang算法练习--KMP

生活有点无聊,就用erlang写写一些算法吧.闲着也闲着     首先是KMP 介绍: http://zh.wikipedia.org/wiki/%E5%85%8B%E5%8A%AA%E6%96%AF-%E8%8E%AB%E9%87%8C%E6%96%AF-%E6%99%AE%E6%8B%89%E7%89%B9%E7%AE%97%E6%B3%95</di
  • 微博
    微信
    QQ
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多仅仅同意输入30个字)

posted on 2017-08-14 20:32  blfbuaa  阅读(165)  评论(0编辑  收藏  举报