P2580 Il a donc fait un mauvais appel (arbre du dictionnaire)

arrière-plan du sujet

L'entraîneur de l'équipe du concours de chimie du collège XS est un amoureux de Hearthstone.

Il roulait le rouleau tout en pétrissant la pierre du four, de sorte qu'un jour il appelait un certain camarade de classe deux fois de suite, puis il se faisait découvrir par le directeur de passage, puis il prenait un repas d'Ola Ola Ola (pour plus de détails , veuillez vous référer au jeu terminé CON900).

description du sujet

Après cela, le directeur vous nomme agent spécial pour enregistrer chaque jour son appel. Le directeur fournira le nombre et la liste des étudiants au concours de chimie, et vous devrez lui dire s'il a commis une erreur. (Pourquoi ne pas simplement l'empêcher de jouer à Hearthstone.)

format d'entrée

La première ligne contient un entier n, représentant le nombre de personnes dans la classe.

Dans les n lignes suivantes, chaque ligne a une chaîne représentant son nom (différente les unes des autres, et ne contient que des lettres minuscules et la longueur ne dépasse pas 5050).

La ligne n+2 contient un entier m, indiquant le nombre de noms rapportés par le coach.

Suivant les m lignes, chaque ligne contient une chaîne représentant le nom de l'entraîneur (uniquement des lettres minuscules, et la longueur ne dépasse pas 5050).

format de sortie

Pour le nom signalé de chaque entraîneur, affichez une ligne.

Si le nom est correct et qu'il s'agit de la première occurrence, sortie  OK, si le nom est incorrect, sortie  WRONG, si le nom est correct mais pas la première occurrence, sortie  REPEAT.

Exemples d'entrée et de sortie

Tapez #1 pour copier

5   
a 
b 
c 
ad 
a cd 
3 
a 
a 
e

copie de la sortie n°1

OK 
RÉPÉTER 
FAUX

Première solution :

Utiliser la carte 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;
}

Deuxième solution :

Application de l'arborescence du dictionnaire :

1. Récupération de chaînes 2. Statistiques de fréquence des mots 3. Tri par ordre de dictionnaire 4. Correspondance de préfixe

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

Je suppose que tu aimes

Origine blog.csdn.net/zhi6fui/article/details/128735353
conseillé
Classement