HDU 1686 Oulipo (pregunta de plantilla KMP)

Enlace del título:

http://acm.hdu.edu.cn/showproblem.php?pid=1686

Descripción del título:

 Dadas dos cadenas, str1 y str2, pregunte cuántas veces aparece str1 en str2.

Ideas para resolver problemas:
 KMP es la primera opción para resolver problemas de coincidencia de cadenas. Se puede ver en el ejemplo que se permite la repetición. Use la
 pregunta de la plantilla KMP estándar de la siguiente matriz y aplique la plantilla KMP directamente.
 Pero: no use cin, no sé por qué uso cin en TLE. ORZ

código
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+100;
const int MAXM=1e4+100;
char s1[MAXN],s2[MAXM];
int next1[MAXM];
void get_next1(int l)
{
	int i,j;
	i=0;j=next1[0]=-1;
	while(i<l)
	{
		if(j==-1||s2[i]==s2[j])
		{
			i++;
			j++;
			next1[i]=j;
		}
		else
			j=next1[j];
	}
}
int kmp(int l1,int l2)
{
	int i,j,ans=0;
	i=j=0;
	while(i<l1)
	{
		if(j==-1||s1[i]==s2[j])
		{
			i++;
			j++;
		}
		else
			j=next1[j];
		if(j==l2)
		{
			ans++;
			j=next1[j];
		}
	}
	return ans;
}
int main()
{
	int T,l1,l2;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s%s",s2,s1);
		l1=strlen(s1);
		l2=strlen(s2);
		get_next1(l2);
		printf("%d\n",kmp(l1,l2));
	}
	return 0;
}

Este artículo es original para bloggers y no puede reproducirse sin permiso.

Supongo que te gusta

Origin www.cnblogs.com/lazy-brain/p/12692802.html
Recomendado
Clasificación