王也枉不了 2021-05-12 18:38 采纳率: 33.3%
浏览 24
已采纳

现在1000ms怎么提到500ms来过oj

#include<bits/stdc++.h>

using namespace std;

int KMP(string str,string p)

{    int count = 0;

    int k=-1,j=0,next[p.length()];

    next[0]= -1;



     while(j<p.length())

         if(k==-1||p[j]==p[k])

             next[++j] = ++k;

         else k=next[k];

            int q=0,e=0;



    while(e<p.length())

    {      if(p[e]==str[q])

        {

            e++; 

            q++;     

        }

        else    e=next[e];

  

      if(e==-1)

        {

          e++;

          q++;

        }



        if(q>=str.length()&&e<p.length())return count;

        else if(q>=str.length()&&e>=p.length())return count+1;

        else if(q<str.length()&&e>=p.length())

        {

    count++;

    q=q-e+1;

    e=0;

        }  

  }

}

int main()

{

    string str,p;

 cin>>str>>p;

    printf("%d",KMP(str,p));

    system("pause"); 



}

题目是

 

子串查找
Description

给定一个字符串AA和一个字符串BB,求BB在AA中的出现次数。AA和BB中的字符均为英语大写字母或小写字母。

AA中不同位置出现的BB可重叠。


Input
输入共两行,分别是字符串AA和字符串BB 。


Output
输出一个整数,表示BB在AA中的出现次数。


Sample Input 1 

zyzyzyz
zyz
 

1≤A,B的长度≤10^6   AA、BB仅包含大小写字母。
 

  • 写回答

4条回答 默认 最新

  • 源代码大师 领域专家: C/C++技术领域 2021-05-12 18:54
    关注

    先判断后循坏比较好,望采纳,不懂的可以关注私信我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?