html

A – KMP模式匹配 一(串)

%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模式匹配 二(串)

%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模式匹配 三(串)

%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;
}

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

Related Posts

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注