poj 3461 主要是内附有讲原理与方法的博客和视频!

来源:互联网 发布:开农村淘宝怎么赚佣金 编辑:程序博客网 时间:2024/05/16 14:12

poj 3461
我就不写博客了,刚开始学CS水平有限,KMP确实有点儿复杂。
现在,我心里是完全清楚了,但还得沉淀一段时间吧~
[方法参考]是B站的一个视频,外国小哥讲得超级超级简洁!!!
我按照他讲得,代码一下子就实现了!!!

原理参考:
前人写的博客讲得贼老好!!
前人写的博客讲得特别棒!!
注意:各种教材、各个博客,使用的下角标都没有统一标准。原理理解就好,不要太拘泥于角标什么的!

方法参考:
真的、doge都能听懂!!可以先按方法实现一次,再学习原理会有更深的理解!!

我的代码:

#include "cstring"#include "cstdio"using namespace std;char P[10005],S[1000005];int  Next[10005],P_len,S_len;void Get_Next(){    int j=0,i=1;    Next[0]=0;    while(i<P_len){        if(P[j]==P[i]){            Next[i++]=++j;}        else{            while(1){                if(j==0&&P[j]!=P[i]){                    Next[i++]=0;break;}                else{                    j=Next[j-1];                    if(P[j]==P[i]){                        Next[i++]=++j;break;}}}}}}int KMP(){    int i=0,j=0,flag=0;    while(i<S_len){        while(j<P_len&&i<S_len){            if(P[j]==S[i])                j++,i++;            else if(j==0&&P[j]!=S[i])                i++;            else                j=Next[j-1];}        if(j==P_len)            flag++,j=Next[j-1];}    return flag;}int main(){    int n,answer;    scanf("%d",&n);    while(n--)    {        scanf("%s%s",P,S);        P_len=strlen(P);        S_len=strlen(S);        Get_Next();        answer=KMP();        printf("%d\n",answer);    }    return 0;}

注意:主串、模式串长度strlen()一次用变量保存下来,不要在循环中每次都strlen()。

阅读全文
0 0
原创粉丝点击