首页 > 代码库 > poj3461kmp
poj3461kmp
求模式串在原串出现次数。
#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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。