每个位置可以和多种数字匹配,然后就用bitset来存,这样每次匹配都还是O(1)的复杂度
#include <cstdio>
#include <cstring>
#include <bitset>
#include <algorithm>
using namespace std;
#define f(i,x,y) for (int i=x;i<=y;i++)
const int N=1e3+5;
bitset<N> ans,b[12];
int n,m,tmp;
char s[5000006];
int main(){
scanf("%d",&n);
f(i,0,n-1){
int k,x;scanf("%d",&k);
f(j,1,k){
scanf("%d",&x);
b[x].set(i);
}
}
getchar();
gets(s);
m=strlen(s);
f(i,0,m-1){
ans<<=1;
ans[0]=1;
ans&=b[s[i]-'0'];
if (ans[n-1]==1){
char c=s[i+1];
s[i+1]=0;
puts(s+i-n+1);
s[i+1]=c;
}
}
return 0;
}