[Ejemplo 3 del capítulo 8 de Ybtoj] Duración del período y [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

Empújelo con la mano y descubra que si el prefijo tiene un prefijo común y un sufijo de longitud j, entonces tiene un período de longitud ij.
jjj puede pasarKMP KMPSe obtiene K M P , el período más largo esjjj es el más pequeño.


Código

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

char s[1000010];
long long ans,n,i,j,p[1000010];

int find(int x){
    
    //查询最小的j
	if(p[x])
		return p[x]=find(p[x]);
	else return x;
}

int main(){
    
    
	scanf("%lld",&n);
	scanf("%s",s+1);
	j=0;
	for(i=1;i<n;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;
	}
	for(int i=1;i<=n;i++)//统计答案
		ans+=i-find(i);
	printf("%lld",ans);
} 

Supongo que te gusta

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