Dictionnaire du CCA
Lien titre: nowcoder 217040
À Niu Ke:
——> Cliquez sur moi pour sauter <——
Idée générale
Il y a quelques mots dont la longueur ne dépasse pas 2 dans le dictionnaire.
Ensuite, chaque fois qu'un mot est donné, on vous demande combien de mots du dictionnaire vous pouvez obtenir en échangeant les lettres adjacentes (ou en ne les échangeant pas).
Idées
Parce que la longueur ne dépasse pas deux, nous considérons des statistiques directes.
Vous pouvez créer un tableau fa, b f_ {a, b}Fa , b, Enregistrer ab abLe mot a b est utilisé comme réponse à l'enquête. (Si le mot n'a qu'une seule lettre, alorsbbb vaut0 00 )
On considère alors que le nombre dans un dictionnaire n'est pas lu, et qu'il estffcorrespondant à sa forme retournéef plus un.
Il existe des cas particuliers où vous n'avez pas besoin d'ajouter la forme de retournement, c'est-à-dire qu'elle est la même que l'original après le retournement, c'est-à-dire qu'un seul caractère ou deux caractères sont identiques.
En fait, s'il est plus gros, vous pouvez utiliser le hachage pour le faire.
Code
#include<cstdio>
#include<cstring>
using namespace std;
int n, ans[31][31];
char c[5], cn;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", &c);
cn = strlen(c);
if (cn == 1) ans[c[0] - 'a' + 1][0]++;
else {
ans[c[0] - 'a' + 1][c[1] - 'a' + 1]++;
if (c[0] != c[1]) ans[c[1] - 'a' + 1][c[0] - 'a' + 1]++;
//如果单词两个字母一样,那翻不翻转都是那样,就不用再加
}
}
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", &c);
cn = strlen(c);
if (cn == 1) printf("%d\n", ans[c[0] - 'a' + 1][0]);
else printf("%d\n", ans[c[0] - 'a' + 1][c[1] - 'a' + 1]);
}
return 0;
}