首先粘贴一个入门博客
https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html
接下来沾上我的板子
//找前缀
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2000010;
int n, m, rt, trie[maxn][27], tot, sum[maxn];
string str;
void insertit(int rt)
{
int len = str.size();
for(int i = 0; i < len; i++)
{
int x = str[i] - 'a';
if(trie[rt][x] == 0) trie[rt][x] = ++tot;
sum[trie[rt][x]]++;
rt = trie[rt][x];
}
}
int tofind(int rt)
{
int len = str.size();
for(int i = 0; i < len; i++)
{
int x = str[i] - 'a';
if(trie[rt][x] == 0) return 0;
rt = trie[rt][x];
}
return sum[rt];
}
入门题讲解:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 2000010;
int n, m, rt, trie[maxn][27], tot;
string str;
void insertit(int rt)
{
int len = str.size();
for(int i = 0; i < len; i++)
{
int x = str[i] - 'a';
if(trie[rt][x] == 0) trie[rt][x] = ++tot;
rt = trie[rt][x];
}
}
bool tofind(int rt)
{
int len = str.size();
for(int i = 0; i < len; i++)
{
int x = str[i] - 'a';
if(trie[rt][x] == 0) return false;
rt = trie[rt][x];
}
return true;
}
int main()
{
cin >> n;
rt = 1; tot = 1;
while(n--)
{
cin >> str;
insertit(rt);
}
cin >> m;
while(m--)
{
cin >> str;
if(tofind(rt)) puts("YES");
else puts("NO");
}
return 0;
}