牛客网练习赛17 好位置B KMP算法

【题目链接】戳这里

给出两个串s和x

定义s中的某一位i为好的位置,当且仅当存在s的子序列


定义s中的某一位i为好的位置,当且仅当存在s的子序列 满足y=x且存在j使得i=kj成立。
问s中是否所有的位置都是好的位置。

输入描述:

一行两个字符串s,x,这两个串均由小写字母构成。
1 <= |s|, |x| <= 200000

输出描述:

Yes表示是。
No表示不是。

 

示例1

输入

abab
ab

输出

Yes

输入

abacaba
aba

输出

No

 

示例3

输入

abc
ba

输出

No

                                                      KMP算法经典

 

  • 首先读懂题意,就是有这么两个串s和x,就是s中的任意一个字符的左右连续字符都能和x匹配,匹配成功yes,不成功no
  • 建立一个Next数组
  • 跑KMP算法,需要处理两个细节,

            1>匹配成功时让j=next[j],方便后续的匹配;

            2>对于匹配成功的进行末尾标记,用于后续判断s中的每个字符都能参与匹配(有很多处理方式,不一一列举,主要是这个标记来做什么的要知道)

  •     KMP大法好
    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    char test[202020],pattern[202020];
    int Next[202020],n,m,pos[202020];
    void getNext(){
    	int i = 0,j = -1;
    	Next[0] = -1;
    	while(i<=m){
    		if(j == -1 || pattern[i] == pattern[j]){
    			i++,j++;
    			Next[i] = j;
    		}
    		else
    			j = Next[j];
    	}
    }
    void KMP(){
    	int i = 0,j = 0;
    	while(i<n){
    		if(j == -1 || test[i] == pattern[j]){
    			i++,j++;
    		}
    		else
    			j = Next[j];
    		if(j == m)
            {
                pos[i-1]=m;
                j=Next[j];
            }
    	}
    }
    int main()
    {
        scanf("%s%s",test,pattern);
        n=strlen(test);
        m=strlen(pattern);
        getNext();
    //    for(int i=0;i<=m;i++)
    //        cout<<Next[i]<<" ";
    //    puts("");
    //    for(i=0,j=0;i<n;++i){
    //        if(test[i]==pattern[j]){
    //            j++;
    //        }
    //        else{
    //            while(j!=-1&&pattern[j]!=test[i]) j=Next[j];
    //            j++;
    //        }
    //        if(j==m){
    //            pos[i]=m;
    //            j=Next[j];
    //        //    j++;
    //        }
    //    }
        KMP();
        bool ok=1;
        int l=n;
        for(int i=n-1;i>=0;i--)
        {
            if(pos[i]==0&&l>=i)
            {
                ok=0;
                break;
            }
            if(pos[i])
                l=i-m;
        }
        ok?puts("Yes"):puts("No");
        return 0;
    }
    
阅读更多
换一批

没有更多推荐了,返回首页