luogu 3879

题目

这题还真的是建立n颗trie树,诀窍在于如何压缩空间。
考虑使用bitset,bitset是8位才一个字节,空间直接除8,开个bitset数组就可以当二维数组用了。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
#include<bitset>
using namespace std;
int n,m,trie[500005][27],k=1;
bitset<1001>b[500005];
char a[1005];
void inse(int x)
{
	int p=0,len;
	cin>>a+1;
	len=strlen(a+1);
	for(int i=1;i<=len;i++)
	{
		if(!trie[p][a[i]-'a'])
		{
			trie[p][a[i]-'a']=k++;
		}
		p=trie[p][a[i]-'a'];
	}
	b[p][x]=1;
}
void fin(char s[])
{
	int p=0,len;
	len=strlen(s+1);
	for(int i=1;i<=len;i++)
	{
		if(!trie[p][s[i]-'a'])
		{
			printf(" \n");
			return;
		}
		p=trie[p][s[i]-'a'];
	}
	for(int i=1;i<=n;i++)
	{
		if(b[p][i])
		{
			printf("%d ",i);
		}
	}
	printf("\n");
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		for(int j=1;j<=x;j++)
		{
			inse(i);
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		scanf("%s",a+1);
		fin(a);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/107340667