KMP

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
/*
                  a b b a a a a b a b a b a a
         next数组 0 1 1 1 2 2 2 2 3 2 3 2 3 2
   优化后的next数组0 1 1 0 2 2 2 1 3 1 3 1 3 2
*/
const int maxn=1e5+10;
int nextl[maxn];
void get_next(string s){              //字符数组从1开始
    nextl[1]=0;nextl[2]=1;
        int len=s.size();
    for(int i=3,j;i<=len;i++){
        j=i-1;
        while(nextl[j]&&s[i-1-1]!=s[nextl[j]-1]){
            j=nextl[j];
        }
        nextl[i]=nextl[j]+1;
    }
}
void nextcil(string s){           //next 数组优化
        int len=s.size();
    for(int i=3;i<=len;i++){
        if(s[i-1]==s[nextl[i]-1])nextl[i]=nextl[nextl[i]];
    }
}
int kmp_str(string s,string T){   //T在s中第一次出现位置,无匹配返回-1
    int lens=s.size(),lent=T.size(),i=1,j=1;
    while(i<=lens&&j<=lent){
        if(!j||s[i-1]==T[j-1])i++,j++;
        else j=nextl[j];
    }
    if(j>lent)return i-j+1;
    return -1;
}
int main(){
    int t;cin>>t;
    while(t--){
        string s,q;
        cin>>s>>q;
        //gets(s);
        //gets(T);
        int len=s.size(),kmp1,kmp2;
        kmp_get_next(s);
        kmp_bet_next(s);
        kmp2=kmp_str(s,q);


        if(kmp2!=-1)cout<<"YES\n";else cout<<"NO\n";

    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务