[Ybtoj Capítulo 8 Ejemplo 2] Subcadena repetida [KMP]

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí


Ideas para resolver problemas

Procesar la matriz ppp , deja que la longitud de la cuerda seannn , la cadena del patrón es1 11 ap [n] p [n]p [ n ] bit y cadena de patrónn-ésimo - p [n] np [n]norte-El bit p [ n ] con el bit n se hace coincidir. Entonces, sinmod (n - p [n]) = = 0 n mod (np [n]) == 0n m o d n-p [ n ] ==0 , hay subcadenas consecutivas repetidas, la longitud esn - p [n] np [n]norte-p [ n ] , el número de ciclos esn / n - p [n] n / np [n]n / n-p [ n ]


Código

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

char s[1000010];
int l,i,j,p[1000010]; 

int main(){
    
    
	scanf("%s",s+1);
	l=strlen(s+1); 
	while(s[1]!='.'||l!=1){
    
    
		i=1;j=0;
		for(int i=1;i<l;i++)
		{
    
    
			while(j>0&&s[i+1]!=s[j+1])
				j=p[j];
			if(s[i+1]==s[j+1])
				j++;
			p[i+1]=j;
		}
		if(l%(l-p[l])==0)
			printf("%d\n",l/(l-p[l]));
		else printf("1\n");
		scanf("%s",s+1);
		l=strlen(s+1); 
		memset(p,0,sizeof(p));
	}
}

Supongo que te gusta

Origin blog.csdn.net/kejin2019/article/details/114440886
Recomendado
Clasificación