牛客网练习赛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
    #include
    #include
    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=0;i--)
        {
            if(pos[i]==0&&l>=i)
            {
                ok=0;
                break;
            }
            if(pos[i])
                l=i-m;
        }
        ok?puts("Yes"):puts("No");
        return 0;
    }
    

你可能感兴趣的:(Acm)