标签:blog class code ext int get
题目:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686
题意:
输入t,是测试组数。每组测试,依次输入 字符串s1和s2。求出s2中s1的个数,可以有重叠。
思路:
KMP算法。
代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char s1[10010],s2[1000010]; int next[10010]; int len1,len2; void get_nextval(char s[],int len) { int i,j; i = -1; j = 0; next[0] = -1; while(j<len) { if(i == -1 || s[i] == s[j]) { j++; i++; next[j] = i; } else i = next[i]; } } int KMP(int m,int n)//m是s1串的长度,n是s2串的长度 { int i=0,j=0; int num=0;//s2中s1的个数,和hdu 2087不同的是,s2中的s1可以有重叠(关键看s1的next数组) while(i<n) { if(s1[j] == s2[i] || j==-1) { i++;j++; if(j==m) { num++; j=next[j]; } } else j=next[j]; } return num; } int main() { //freopen("input.txt","r",stdin); int t; cin>>t; getchar(); while(t--) { gets(s1); gets(s2); len1 = strlen(s1); len2 = strlen(s2); get_nextval(s1,len1); cout<<KMP(len1,len2)<<endl; } return 0; }
hdu 1686 Oulipo,布布扣,bubuko.com
标签:blog class code ext int get
原文地址:http://blog.csdn.net/u013147615/article/details/25283597