CF 8 A

来源:互联网 发布:excel跨工作簿引用数据 编辑:程序博客网 时间:2024/06/06 01:20

对KMP的熟练使用

View Code
我的代码   kmp匹配过去,需要熟练掌握KMP,数据范围大一点也没关系#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100010;int n,mb,mc;char a[maxn],b[maxn],c[maxn];int p1[maxn],p2[maxn];void getp(int p[],int m,char b[]){    p[1]=0;    int i,j=0;    for(i=2;i<=m;i++){        while(j>0&&b[j+1]!=b[i]) j=p[j];        if(b[j+1]==b[i]) j+=1;        p[i]=j;    }}int kmp(int i,int p[],int m,char b[]){    int j=0;    for(;i<=n;i++){        while(j>0&&b[j+1]!=a[i]) j=p[j];        if(b[j+1]==a[i]) j+=1;        if(j==m){            return i;        }    }    return -1;}int main(){        scanf("%s",a+1);        n=strlen(a+1);        int flag=0;        scanf("%s",b+1);mb=strlen(b+1);getp(p1,mb,b);        scanf("%s",c+1);mc=strlen(c+1);getp(p2,mc,c);        int t=kmp(1,p1,mb,b);        if(t!=-1  && t<n && kmp(t+1,p2,mc,c)!=-1)  flag|=1;        reverse(a+1,a+1+n);        t=kmp(1,p1,mb,b);        if(t!=-1  && t<n && kmp(t+1,p2,mc,c)!=-1) flag|=2;        const char* ans[]={"fantasy","forward","backward","both"};        puts(ans[flag]);    return 0;}网上的代码  用strstr,数据范围较大的情况可能效率就差了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;char s[100500],a[200],b[200];int main(){    int n=strlen(gets(s));    int x=strlen(gets(a));    int y=strlen(gets(b));    int flag=0;    if(strstr(s,a) && strstr(strstr(s,a)+x,b)) flag|=1;    reverse(s,s+n);    if(strstr(s,a) && strstr(strstr(s,a)+x,b)) flag|=2;    const char* ans[]={"fantasy","forward","backward","both"};    puts(ans[flag]);}
原创粉丝点击