题目: http://oj.daimayuan.top/course/7/problem/537
思想 : 字典树添加与查找
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5+5;
const int inf = 0x3f3f3f3f;
int n,m;
int nxt[N][26];
//nxt[i][j]=k,表示编号为i的节点的第j个孩子是编号为k的节点
int cnt;
bool isend[N];
string a;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
int len=a.size();
int now=0;
for(int j=0;j<len;j++){
int x=a[j]-'a';
if(!nxt[now][x]){
nxt[now][x]=++cnt;
}
now=nxt[now][x];
}
isend[now]=true;
}
cin>>m;
for(int i=1;i<=m;i++){
cin>>a;
int len=a.size();
int now=0;
bool ok=true;
for(int j=0;j<len&&ok;j++){
int x=a[j]-'a';
if(!nxt[now][x]){
ok=false;
}
else{
now=nxt[now][x];
}
}
if(ok){
if(!isend[now]){
ok=false;
}
}
cout<<ok<<"\n";
}
return 0;
}