码迷,mamicode.com
首页 > 其他好文 > 详细

KMP 练习

时间:2015-08-13 15:54:45      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:poj   c++   kmp   iostream   编程   

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 练习

标签:poj   c++   kmp   iostream   编程   

原文地址:http://blog.csdn.net/zp___waj/article/details/47612563

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!