CCA的词典
题目链接:nowcoder 217040
到牛客看:
题目大意
有一些长度不超过 2 的单词在字典中。
然后每次给出一个单词,问你多少个字典中的单词可以通过交换相邻字母(或者不交换)得到这个单词。
思路
因为长度不超过二,我们考虑直接统计。
可以搞一个数组 f a , b f_{a,b} fa,b,记录 a b ab ab 这个单词作为询问的答案。(如果这个单词只有一个字母,那 b b b 就是 0 0 0)
然后我们考虑没读入一个字典中的数,就把它和它的翻转形对应的 f f f 加一。
有特殊的情况不用给翻转形加,就是翻转之后跟原来一样,那就是只有一个字符或者两个字符一样。
其实如果大一点可以用哈希来做。
代码
#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;
}