【ybtoj 高效进阶 2.4】 【Trie树】 阅读理解
题目
解题思路
将每一个单词都放入字典树中
用vis数组标记第x篇文章里出现过在字典树中以p结尾的单词
输入需要查找的单词
匹配单词结尾的编号
询问有几篇文章的vis标记过
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int vis[1000][500010],trie[500010][30];
int n,m,w,tot=1;
string s;
void insert(int x) //放进字典树
{
int len=s.size(),p=1;
for (int i=0;i<len;i++)
{
int c=s[i]-'a';
if (!trie[p][c]) trie[p][c]=++tot;
p=trie[p][c];
}
vis[x][p]=1;
}
void find()
{
int len=s.size(),p=1,f=1;
for (int i=0;i<len;i++)
{
int c=s[i]-'a';
if (!trie[p][c])
{
f=0;
break;
}
p=trie[p][c];
} //匹配出单词的结尾
if (f)
for (int i=1;i<=n;i++)
if (vis[i][p]) printf("%d ",i); //输出包含他的文章
printf("\n");
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&w);
for (int j=1;j<=w;j++)
{
cin>>s;
insert(i);
}
}
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
cin>>s;
find();
}
return 0;
}