【ybtoj 高效进阶 2.4】 【Trie树】 阅读理解

【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;
} 

猜你喜欢

转载自blog.csdn.net/qq_45621109/article/details/115263613