码迷,mamicode.com
首页 > 编程语言 > 详细

NYoj-Binary String Matching-KMP算法

时间:2014-10-18 09:50:53      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:算法   kmp   string   cstring   namespace   

Binary String Matching

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
输入
The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A.
输出
For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
样例输入
3
11
1001110110
101
110010010010001
1010
110100010101011 
样例输出
3
0
3 
/******KMP算法*********/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
//#define MAXSTRLEN  1000
char s[1010];
char t[11];
int next[1010];
using namespace std;
void Next()
{
	int i=0;
	int j=-1;
	next[0]=-1;
	int len_t=strlen(t);
	while(i<len_t-1)
	{
		if(j==-1||t[i]==t[j])
		{
			i++;
			j++;
			next[i]=j;
		}
		else
		    j=next[j];
	}
}
int KMP()
{
	int i=-1;
	int j=-1;
	int len_t=strlen(t);
	int len_s=strlen(s);
	int count=0;
	Next();
	while(i<len_s)
	{
		if(j==-1||s[i]==t[j])
		{
			i++;
			j++;
		}
		else
		{ 
		      j=next[j];
	    }
		if(j==len_t)
		{
			i=i-j;
			j=-1;
			count++;
		} 
	}
	return count;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s %s",t,s);
		printf("%d\n",KMP());
	}
	return 0; 
} 


NYoj-Binary String Matching-KMP算法

标签:算法   kmp   string   cstring   namespace   

原文地址:http://blog.csdn.net/holyang_1013197377/article/details/40207867

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!