Niuniu y cuerda todos los días

Enlace: https://ac.nowcoder.com/acm/contest/11334/G
Fuente: Niuke

El título describe lo que
Niuniu tiene que hacer todos los días es leer libros y encontrar frases que le gusten del libro. Leerá un libro todos los días. Si Niuniu lee un libro hoy con {} kk caracteres seguidos, esa es la frase favorita de Niuniu Con un cierto prefijo, Niuniu obtendrá {} kk puntos de emoción, pero solo puede notar la oración que le gusta una vez al día (es decir, solo puede aumentar la emoción una vez al día), lo que significa que intentará encontrar la frase que le gusta. Entonces, ¿cuánta emoción puede tener Niu Niu como máximo después de {} nn días la oración con mayor entusiasmo?

Descripción de entrada: la
primera línea es una cadena s (| s | <= 1 × 10 ^ 5), que significa la cadena que le gusta a Niuniu. La primera línea es una cadena s (∣s∣ <= 1 × 10
5
), lo que significa Niuniu Cadena favorita

La segunda línea es un número entero n, que representa un total de n días (n <= 100) {} La segunda línea es un número entero n, que representa un total de n días (n <= 100). Las
siguientes n líneas tienen un carácter por línea cadena t_i (| t_i | <= 1 × 10 ^ 5), respectivamente, representan el libro de lectura de carne de res del i-ésimo día siguiente n líneas de cada cadena T
i (| T i | <= 10 ×. 1. 5 ), Representar respectivamente los libros que Niuniu leyó el i día Descripción de la salida : Produzca la mayor emoción que Niuniu puede obtener en los n días








Ejemplo 1 copia de
entrada abcdefg 3 adcabc xyz abdefg copia de salida 5 descripción Hay "a" y "abc" en el primer día para aumentar la emoción, seleccione "abc", no en el segundo día, y "ab" en el tercer día, totalizando 5










Vea dónde puede coincidir cada cadena con la cadena del patrón

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10;

int ne[N];

int main(){
    
    
	char str[N];
	cin >> str + 1;
	
	int len = 1;
	while(str[len])   len ++;
	
	for (int i = 2, j = 0; i < len; i ++){
    
    
		while(j && str[i] != str[j + 1])   j = ne[j];
		if (str[i] == str[j + 1])    ne[i] = j;
		j = ne[j];
	}
	
	int n;
	long long ans = 0;
	scanf("%d", &n);
	
	for (int i = 1; i <= n; i ++){
    
    
		int cnt = 0;
		char s[N];
		cin >> s + 1;
		int len = 1;
		while(s[len])  len ++;
		for (int i = 1, j = 0; i < len; i ++){
    
    
			while(j && s[i] != str[j + 1])   j = ne[j];
			if (s[i] == str[j + 1])   j ++;
			cnt = max(cnt, j);
		}
		ans += cnt;
	}
	
	cout << ans << endl;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45772483/article/details/112557985
Recomendado
Clasificación