P2580 Entonces comenzó la lista equivocada (árbol de diccionario)

fondo del tema

El entrenador del equipo de competencia de química de la escuela secundaria XS es ​​un amante de Hearthstone.

Hacía rodar el rollo mientras amasaba la piedra del horno, de modo que un día llamó a cierto compañero de clase dos veces seguidas, y luego fue descubierto por el director que pasaba, y luego comió Ola Ola Ola (para más detalles). , consulte el juego completo CON900).

Tema Descripción

Después de esto, el director lo nombra agente especial para registrar su pase de lista todos los días. El director proporcionará el número y la lista de estudiantes en la competencia de química, y usted deberá informarle si ha cometido un error. (¿Por qué no simplemente impedirle que juegue Hearthstone?)

formato de entrada

La primera línea contiene un número entero n, que representa el número de personas en la clase.

En las siguientes n líneas, cada línea tiene una cadena que representa su nombre (diferentes entre sí, solo contienen letras minúsculas y la longitud no excede 5050).

La línea n+2 contiene un número entero m, que indica el número de nombres informados por el entrenador.

Las siguientes m líneas, cada línea contiene una cadena que representa el nombre del entrenador (solo letras minúsculas y la longitud no excede 5050).

formato de salida

Para el nombre informado de cada entrenador, genere una línea.

Si el nombre es correcto y es la primera aparición, genera  OK, si el nombre es incorrecto, genera  WRONG, si el nombre es correcto pero no es la primera aparición, genera  REPEAT.

Muestras de entrada y salida

Escriba #1 para copiar

5   
a 
b 
c 
anuncio 
acd 
3 
a 
a 
e

salida #1 copia

OK 
REPETIR 
MAL

Solución uno:

Usar mapa STL

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
int n;
int main() {
	map<string, int> student;
	string name;
	cin >> n;
	while (n--) {
		cin >> name;
		student[name] = 1;
	}
	int m; cin >> m;
	while (m--) {
		cin >> name;
		if (student[name] == 1) { puts("OK"); student[name] = 2; }
		else if (student[name] == 2) puts("REPEAT");
		else    puts("WRONG");
	}
	return 0;
}

Solución dos:

Aplicación del árbol del diccionario:

1. Recuperación de cadenas 2. Estadísticas de frecuencia de palabras 3. Ordenación del diccionario 4. Coincidencia de prefijos

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
using namespace std;
const int N = 800000;
struct node {
	bool repeat; // 这个前缀是否重复
	int son[26]; //26个字母
	int num; // 这个前缀出现的次数
}t[N];
int cnt = 1;  // 当前新分配的存储位置,把cnt = 0 留给根节点
void Insert(char* s) {
	int now = 0;
	for (int i = 0; s[i]; i++) {
		int ch = s[i] - 'a';
		if (t[now].son[ch] == 0) {
			t[now].son[ch] = cnt++;
		}
		now = t[now].son[ch];
		t[now].num++;
	}
}
int Find(char* s) {
	int now = 0;
	for (int i = 0; s[i]; i++) {
		int ch = s[i] - 'a';
		if (t[now].son[ch] == 0) return 3;
		now = t[now].son[ch];
	}
	if (t[now].num == 0) return 3; // 这个前缀没有出现过
	if (t[now].repeat == false) {
		t[now].repeat = true;
		return 1;
	}
	return 2;
}
int main() {
	char s[51];
	int n;
	cin >> n;
	while (n--) {
		scanf("%s", s);
		Insert(s);
	}
	int m;
	scanf("%d", &m);
	while (m--) {
		scanf("%s", s);
		int r = Find(s);
		if (r == 1) { puts("OK"); }
		else if (r == 2) { puts("REPEAT");}
		else { puts("WRONG"); }
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/128735353
Recomendado
Clasificación