hihocoder 1015 KMP演算法 (KMP模板)

_TCgogogo_發表於2016-03-08
時間限制:1000ms
單點時限:1000ms
記憶體限制:256MB

描述

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

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

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

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

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

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

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

提示一:KMP的思路

提示二:NEXT陣列的使用

提示三:如何求解NEXT陣列

輸入

第一行一個整數N,表示測試資料組數。

接下來的N*2行,每兩行表示一個測試資料。在每一個測試資料中,第一行為模式串,由不超過10^4個大寫字母組成,第二行為原串,由不超過10^6個大寫字母組成。

其中N<=20

輸出

對於每一個測試資料,按照它們在輸入中出現的順序輸出一行Ans,表示模式串在原串中出現的次數。

樣例輸入
5
HA
HAHAHA
WQN
WQN
ADA
ADADADA
BABABB
BABABABABABABABABB
DAD
ADDAADAADDAAADAAD
樣例輸出
3
1
3
1
0

題目連結:http://hihocoder.com/problemset/problem/1015

#include <cstdio>
#include <cstring>
int const MAXN = 1e6 + 5;
int const MAXM = 1e4 + 5;
char s[MAXN], t[MAXM];
int next[MAXM], n;

void get_next()
{
	next[0] = -1;
	int i = 0, j = -1;
	while(t[i] != '\0')
	{
		if(j == -1 || t[i] == t[j])
		{
			i ++;
			j ++;
			next[i] = j;
		}
		else 
			j = next[j];
	}
}	

int KMP()
{
	get_next();
	int i = 0, j = 0, ans = 0, len = strlen(t);
	while(s[i])
	{
		if(j == -1 || s[i] == t[j])
		{
			i ++;
			j ++;
		}
		else
			j = next[j];
		if(j == len)
		{
			j = next[j];
			ans ++;
		}
	}
	return ans;
}	

int main()
{
	scanf("%d", &n);
	while(n --)
	{
		scanf("%s %s", t, s);
		printf("%d\n", KMP());
	}
}


相關文章