本文主要是介绍poj3461(kmp),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
链接:点击打开链接
题意:求串A在串B中出现的次数
代码:
#include <map>
#include <set>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=1000005;
int nex[siz];
char S[siz],T[siz];
void getnex(int len){int i,j;j=-1,i=0;nex[0]=-1;while(i<len){if(j==-1||T[i]==T[j])nex[++i]=++j;elsej=nex[j];}
}
int kmp(int slen,int tlen){int i,j,ans;i=j=ans=0;getnex(tlen);while(i<slen){if(j==-1||S[i]==T[j])i++,j++;elsej=nex[j];if(j==tlen){ //找到后往回跳并且计数 i--;j=nex[j-1];ans++;}}return ans;
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%s%s",T,S);printf("%d\n",kmp(strlen(S),strlen(T)));}return 0;
}
这篇关于poj3461(kmp)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!