题目链接:
点击打开链接
关于trie树复杂度什么的,题目里面有
代码:
#include<iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
char s[15];
int ans;
int tot = 1;
struct TreeNode{
char ch;
int next,head;
int cnt;
bool has_son[26];
}tree[1000005];
void add(int fa, int pos){
int cur;
if(tree[fa].has_son[s[pos]-'a']==false){
cur = tot;
tree[tot].next = tree[fa].head;
tree[fa].head = tot;
tree[tot].cnt = 1;
tree[tot].head = -1;
tree[tot++].ch = s[pos];
tree[fa].has_son[s[pos]-'a'] = true;
}
else {
int tmp = tree[fa].head;
while(1){
if(tree[tmp].ch == s[pos]){
cur = tmp;
break;
}
tmp = tree[tmp].next;
}
tree[cur].cnt++;
}
int len = strlen(s);
if(pos < len-1) {
add(cur,pos+1);
}
}
void cal(int fa, int pos){
int cur;
if(tree[fa].has_son[s[pos]-'a'] == false){
return;
}
else{
int tmp = tree[fa].head;
while(1){
if(tree[tmp].ch == s[pos]){
cur = tmp;
break;
}
tmp = tree[tmp].next;
}
if(pos == strlen(s) - 1){
ans += tree[cur].cnt;
return;
}
cal(cur,pos+1);
}
}
int main(){
int n,m;
scanf("%d",&n);
tree[0].next = tree[0].head = -1;
memset(tree[0].has_son,false,sizeof(tree[0].has_son));
while(n--){
scanf("%s",s);
add(0,0);
}
scanf("%d",&m);
ans = 0;
while(m--){
scanf("%s",s);
ans = 0;
cal(0,0);
printf("%d\n",ans);
}
}