数据结构实验之串三:KMP应用

来源:互联网 发布:苹果系统mac系统下载 编辑:程序博客网 时间:2024/04/30 01:10

题目链接

#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=100000000+1000;int next[maxn];int a[maxn], b[maxn];void getnext(int len)///寻找每个位置的最大公共子缀的长度{int i=0,j=-1;next[0]=-1;while(i<len){if(j==-1||b[i]==b[j]){i++;j++;next[i]=j;}else{j=next[j];}}}int kmp(int lena, int lenb, int p){    getnext(lenb);    int i=p, j=0;    while(i<lena&&j<lenb)    {        if(j==-1||a[i]==b[j])        {            i++;            j++;        }        else        {            j=next[j];        }    }    if(j==lenb)        return i-lenb+1;    else        return -1;}int main(){    ios::sync_with_stdio(false);    int n, m;    while(cin>>n)    {        for(int i=0;i<n;i++)            cin>>a[i];        cin>>m;        for(int i=0;i<m;i++)            cin>>b[i];        int x=kmp(n, m, 0);///需要判断两次,因为题意是是唯一确定的一对l和r;        if(x!=-1)        {            int k=kmp(n, m, x+m-1);            if(k==-1)                cout<<x<<" "<<x+m-1<<endl;///输出的是数组下标,并不是数组值            else                cout<<"-1"<<endl;        }        else            cout<<"-1"<<endl;    }    return 0;}


0 0
原创粉丝点击