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;
}