BOTKJPJT,poj3461kmp

 2023-10-06 阅读 29 评论 0

摘要:求模式串在原串出現次數。 BOTKJPJT。? #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list>

求模式串在原串出現次數。

BOTKJPJT。?

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>using namespace std;const int maxn=1111111;int next[maxn];void getnext(char *s)
{int len=strlen(s);int j=-1;int i=0;next[0]=-1;while(i<len){if(j==-1||s[i]==s[j]){i++;j++;next[i]=j;}else{j=next[j];}}
}//求next 數組函數   next[j]  表示從 str[j-1]向前和從頭str[0]向后 最長相同串的長度
int ans;
void solve(char *s,char  *s1)
{int j=0;int len=strlen(s);int len1=strlen(s1);for(int i=0;i<len1;i++){if(j>0&&s1[i]!=s[j]) j= next[j]; //失配之后 將 str[next[j]] 與 str1[i] 比較if(s[j]==s1[i]) j++;if(j==len){ans++;j=next[j];  //找到答案 后繼續失配。。
        }}cout<<ans<<endl;
}
char str[maxn];char str1[maxn];
int main()
{int Icase;cin>>Icase;while(Icase--){scanf("%s",str);scanf("%s",str1);ans=0;getnext(str);solve(str,str1);}return 0;
}

?

轉載于:https://www.cnblogs.com/yigexigua/p/3870170.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/120134.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息