标签:over letter namespace possible dia test log nat max
InputThe first line of the input file contains a single number: the number of test cases to follow. Each test case has the following format:
One line with the word W, a string over {‘A‘, ‘B‘, ‘C‘, …, ‘Z‘}, with 1 ≤ |W| ≤ 10,000 (here |W| denotes the length of the string W).
One line with the text T, a string over {‘A‘, ‘B‘, ‘C‘, …, ‘Z‘}, with |W| ≤ |T| ≤ 1,000,000.
OutputFor every test case in the input file, the output should contain a single number, on a single line: the number of occurrences of the word W in the text T.
Sample Input
3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN
Sample Output
1 3 0
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<string> #include<cstring> using namespace std; #define MAXN 1000001 typedef long long LL; /* KMP 查找子串出现的次数 */ char s[MAXN],t[MAXN]; int Next[MAXN]; void pre_kmp(int m) { int j,k; j = 0;k = -1;Next[0] = -1; while(j<m) if(k==-1||t[k]==t[j]) Next[++j] = ++k; else k = Next[k]; } int KMP(char s[],char t[],int n,int m) { int i,j,ans; i = j = ans = 0; if(n==1&&m==1) return (s[0]==t[0])?1:0; pre_kmp(m); for(i=0;i<n;i++) { while(j>0&&s[i]!=t[j]) j = Next[j]; if(s[i]==t[j]) j++; if(j==m) { ans++; j = Next[j]; } } return ans; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s%s",t,s); printf("%d\n",KMP(s,t,strlen(s),strlen(t))); } }
标签:over letter namespace possible dia test log nat max
原文地址:http://www.cnblogs.com/joeylee97/p/6671069.html