这题还真的是建立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);
}
}