HihoCoder KMP算法

時間限制:1000ms
單點時限:1000ms
內存限制:256MB

描述

小Hi和小Ho是一對好朋友,出生在信息化社會的他們對編程產生了莫大的興趣,他們約定好互相幫助,在編程的學習道路上一同前進。

這一天,他們遇到了一隻河蟹,於是河蟹就向小Hi和小Ho提出了那個經典的問題:“小Hi和小Ho,你們能不能夠判斷一段文字(原串)裏面是不是存在那麼一些……特殊……的文字(模式串)?

小Hi和小Ho仔細思考了一下,覺得只能想到很簡單的做法,但是又覺得既然河蟹先生這麼說了,就肯定不會這麼容易的讓他們回答了,於是他們只能說道:“抱歉,河蟹先生,我們只能想到時間複雜度爲(文本長度 * 特殊文字總長度)的方法,即對於每個模式串分開判斷,然後依次枚舉起始位置並檢查是否能夠匹配,但是這不是您想要的方法是吧?”

河蟹點了點頭,說道:”看來你們的水平還有待提高,這樣吧,如果我說只有一個特殊文字,你能不能做到呢?“

小Ho這時候還有點暈暈乎乎的,但是小Hi很快開口道:”我知道!這就是一個很經典的模式匹配問題!可以使用KMP算法進行求解!“

河蟹滿意的點了點頭,對小Hi說道:”既然你知道就好辦了,你去把小Ho教會,下週我有重要的任務交給你們!“

”保證完成任務!”小Hi點頭道。   

樣例輸入5
HA
HAHAHA
WQN
WQN
ADA
ADADADA
BABABB
BABABABABABABABABB
DAD
ADDAADAADDAAADAAD樣例輸出31310
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int Next[10000],ans=0;
void cal_next(const char *string, int len)
{
	int i,pre=0;
	for ( i = 1;i < len;i++)
	{
		if (string[i] != string[pre])
			Next[i] =pre=0;
		else
			Next[i] = ++pre;
	}
}
void KMP(const char*string1,const char*string2, int len1, int len2)
{
	int i=0, j=0;
	for ( ;i < len1;)
	{
		for (;j < len2;j++)
			if (string1[i + j]!= string2[j])
				break;
		if (j == len2)  ans++;
		if(j!=0)
		i = i +j-Next[j-1],j = Next[j - 1];
		else i++;
	}
}
int main()
{
	string a, b;
	int N;
	cin >> N;
	while (N--) {
		ans = 0;
		memset(Next, 0, sizeof(Next));
		cin >> a >> b;
		int len1 = strlen(a.c_str()), len2 = strlen(b.c_str());
		cal_next(a.c_str(), len1);
		KMP(b.c_str(), a.c_str(), len2, len1);
		cout << ans << endl;
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章