题意:
给一个单词字典 A={str[0],str[1],...} ,再给定一系列的单词 B={s[0],s[1],s[2],...} ,求字典A中以s[i]为前缀的单词有多少。
解法:
先建字典数,然后再查询每个给定的单词为前缀出现了多少次。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int sigma_size = 26;
char str[30];
struct Node {
int cnt;
Node *child[sigma_size];
Node() {
cnt = 0;
for(int i = 0; i < sigma_size; i++)
child[i] = NULL;
}
};
int idx(char ch) {
return ch - 'a';
}
void insert(Node* node, char s[]) {
int len = strlen(s);
for(int i = 0; i < len; i++) {
int id = idx(s[i]);
if(node->child[id] == NULL)
node->child[id] = new Node();
node = node->child[id];
(node->cnt)++;
}
}
int find(Node* node, char s[]) {
int len = strlen(s);
for(int i = 0; i < len; i++) {
int id = idx(s[i]);
if(node->child[id] == NULL)
return 0;
node = node->child[id];
}
return node->cnt;
}
int main() {
Node* root = new Node();
while(gets(str) && str[0] != '\0') {
insert(root, str);
}
while(gets(str)) {
printf("%d\n", find(root, str));
}
return 0;
}