前缀树插入、搜索模板:
分别给出n,m个字符串,分别判断m个字符串是否在n个字符串中(子串不算)
#include<bits/stdc++.h>
using namespace std;
int tree[100][100],isEnd[100],cnt,root; //cnt对每个字符编号;
int T1,T2;
void insert(string a){
root=0;
for(int i=0;i<a.size();i++)
{
int t=a[i]-'a';
if(!tree[root][t]) tree[root][t]=++cnt; //如果数组里为0,说明没有枝节点,则存该字符;
root=tree[root][t]; //根节点转移到这个字符;
}
isEnd[root]=1; //标记结束的位置;
}
int find(string a){
root=0;
for(int i=0;i<a.size();i++)
{
int t=a[i]-'a';
if(!tree[root][t]) return 0; //如果当前数组为0,则说明没存完整,查找失败,返回;
root=tree[root][t]; //根节点转移;
}
return isEnd[root]==1; //最后,看最后一个字符是否为存进的结束字符;
}
int main(){
cin>>T1>>T2;
while(T1--)
{
string a;
cin>>a;
insert(a);
}
while(T2--)
{
string a;
cin>>a;
cout<<find(a)<<endl;
}
return 0;
}