向前走莫回头❤

【POJ 3461】Oulipo(kmp)

Oulipo
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 37173   Accepted: 15003

Description

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quote from the book:

Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis surgissait l’inhumain, l’affolant. Il aurait voulu savoir où s’articulait l’association qui l’unissait au roman : stir son tapis, assaillant à tout instant son imagination, l’intuition d’un tabou, la vision d’un mal obscur, d’un quoi vacant, d’un non-dit : la vision, l’avision d’un oubli commandant tout, où s’abolissait la raison : tout avait l’air normal mais…

Perec would probably have scored high (or rather, low) in the following contest. People are asked to write a perhaps even meaningful text on some subject with as few occurrences of a given “word” as possible. Our task is to provide the jury with a program that counts these occurrences, in order to obtain a ranking of the competitors. These competitors often write very long texts with nonsense meaning; a sequence of 500,000 consecutive 'T's is not unusual. And they never use spaces.

So we want to quickly find out how often a word, i.e., a given string, occurs in a text. More formally: given the alphabet {'A''B''C', …, 'Z'} and two finite strings over that alphabet, a word W and a text T, count the number of occurrences of W in T. All the consecutive characters of W must exactly match consecutive characters of T. Occurrences may overlap.

Input

The 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.

Output

For 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

Source

[Submit]   [Go Back]   [Status]   [Discuss]

Home Page   Go Back  To top

[题意][查找一个字串在另一个串中的出现次数]
【题解】【kmp】
【先构造子序列s1的失配函数,再查找,可将复杂度降至O(KN),线性查找。】 
【开始时将两个指针都指向序列开头,若相同,同时移动两个指针,若不同,将s1的指针j=t[j],即s1的失配函数,再继续向后查找;若j==l1,则s1序列被
找到,将计数器加1,并将j=t[j],再度寻找】 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t[10010],l1,len,n;
char s[1000010],s1[10010];
void next()
{
	int i,j;
	memset(t,0,sizeof(t));
	t[0]=-1; 
	for (i=0;i<l1;++i)
	 {
	 	j=t[i];
	 	while (j!=-1&&s1[j]!=s1[i])
	 	   j=t[j];
	 	t[i+1]=j+1;
	 }
	return;
}

int kmp()
{
	int i=0,j=0,sum=0;
	while (i!=len)
	 {
	 	if (s[i]==s1[j]||j==-1)
	 	   {i++; j++;}
	 	 else j=t[j];
	 	if (j==l1)
	 	   {sum++; j=t[j];	}
	 }
	return sum;
}
int main()
{
	int i,ans;
	scanf("%d\n",&n);
	for (i=1;i<=n;++i)
	 {
	 	gets(s1); gets(s);
	 	len=strlen(s);
	 	l1=strlen(s1);
	 	next();
	 	ans=kmp();
	 	printf("%d\n",ans);
	 }
	return 0;
}


posted @ 2016-11-12 07:38  lris0-0  阅读(61)  评论(0编辑  收藏  举报
过去的终会化为美满的财富~o( =∩ω∩= )m