思路:
这道题直接打板子,然后用一个数组标记一下就行了
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m, tot=1;
int tire[500010][30];
struct node
{
int v[1010];
}e[500010];
void insert_s(string s, int l)
{
int p=1;
for(int i=0; i<s.size(); i++)
{
int c=s[i]-'a'+1;
if(!tire[p][c])
tire[p][c]=++tot;
p=tire[p][c];
}
e[p].v[l]=1;
}
bool get_s(string s, int l)
{
int p=1;
for(int i=0; i<s.size(); i++)
{
int c=s[i]-'a'+1;
if(!tire[p][c])
return 0;
p=tire[p][c];
}
return e[p].v[l];
}
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
int k;
cin>>k;
for(int j=1; j<=k; j++)
{
string s;
cin>>s;
insert_s(s, i);
}
}
scanf("%d", &m);
while(m--)
{
string s;
cin>>s;
int i=1;
while(i<=n&&get_s(s, i)!=1)
i++;
if(i==n&&get_s(s, i)==1)
printf("%d", n);
else if(i<n)
printf("%d", i);
i++;
for(; i<=n; i++)
{
if(get_s(s, i))
printf(" %d", i);
}
printf("\n");
}
return 0;
}