#define ll long long #define I inline #define N 1000001
usingnamespacestd;
namespace Trie{ structNode{ int son[27]; //可能出现的子节点,一共从a到z共26 int cnt; //cnt 有多少个以当前节点结尾的字符串 int size; //size 有多少个字符串以当前节点为前缀 int number; //点名的次数 }node[N];
int tot;
voidinsert(string s){ //向Trie树中插入一个字符串 int len = s.length() , rt = 0; for(int i = 0; i < len; i ++){ int c = s[i] - 'a'; if(!node[rt].son[c]){ node[rt].son[c] = ++ tot; //如果没有这个字母,就插入 } rt = node[rt].son[c]; //向下转移 node[rt].size ++; } node[rt].cnt ++; //统计答案,以当前节点结尾的字符串 + 1 }
intfind(string s){ int len = s.length() , rt = 0; for(int i = 0; i < len; i ++){ int c = s[i] - 'a'; if(!node[rt].son[c]){ return0; //如果有一位找不到了,直接返回 } rt = node[rt].son[c]; //向下转移 } node[rt].number ++; //被多叫到了一次 return node[rt].number; }
}
usingnamespace Trie;
int n , m;
intmain(){ string q; cin >> n; for(int i = 1; i <= n; i ++){ cin >> q; insert(q); //把名字插入Trie树 } cin >> m; cout << "\n"; for(int i = 1; i <= m; i ++){ cin >> q; int num = find(q); if(num == 0){ //如果找不到这个名字 cout << "WRONG" << "\n"; } elseif(num == 1){ //如果是第一次叫到 cout << "OK" << "\n"; } else{ //如果被叫到很多次了 cout << "REPEAT" << "\n"; } } return0; }