Description
英語老師留了N篇閱讀理解做業,可是每篇英文短文都有不少生詞須要查字典,爲了節約時間,如今要作個統計,算一算某些生詞都在哪幾篇短文中出現過。ios
Input
第一行爲整數N,表示短文篇數,其中每篇短文只含空格和小寫字母。git
按下來的N行,每行描述一篇短文。每行的開頭是一個整數L,表示這篇短文由L個單詞組成。接下來是L個單詞,單詞之間用一個空格分隔。spa
而後爲一個整數M,表示要作幾回詢問。後面有M行,每行表示一個要統計的生詞。code
Output
對於每一個生詞輸出一行,統計其在哪幾篇短文中出現過,並按從小到大輸出短文的序號,序號不該有重複,序號之間用一個空格隔開(注意第一個序號的前面和最後一個序號的後面不該有空格)。若是該單詞一直沒出現過,則輸出一個空行。ip
裸的\(Trie\)樹,結果被卡空間???get
搞得要開\(bitset\)。input
咱們對於每個位置記錄其在哪出現過。it
咱們記錄\(b[x][i]\)表明當前這個單詞的結尾\(x\)是否在\(i\)行出現過。io
最後查詢的時候直接枚舉便可。class
代碼
#include<cstdio> #include<bitset> #include<iostream> #include<algorithm> #define R register using namespace std; const int gz=300001; inline void in(int &x) { int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f; } int ch[gz][26],idx,n,m; bitset<1001> b[gz]; char s[31]; inline void insert(R char *s,R int x) { R int u=0; for(R int i=0;s[i];i++) { R int v=s[i]-'a'; if(!ch[u][v])ch[u][v]=++idx; u=ch[u][v]; } b[u][x]=true; } inline void query(R char *s) { R int u=0; for(R int i=0;s[i];i++) { R int v=s[i]-'a'; if(!ch[u][v]){goto he;} u=ch[u][v]; } for(R int i=1;i<=n;i++) if(b[u][i])printf("%d ",i); he :; puts(""); } int main() { in(n); for(R int i=1,x;i<=n;i++) { in(x); for(R int j=1;j<=x;j++) { scanf("%s",s); insert(s,i); } } in(m); for(R int i=1;i<=m;i++) { scanf("%s",s); query(s); } }