点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e6,M=1e3+10;
int son[N][26];
char str[21];
//这个bitset变量实际上就是集合的一种变形,实现了一个二维数组,映射起来有点麻烦,/但是内存就是优点
bitset<M> bs[N];
int n,m,idx;
//对每一个单词进行读入,因此最后的p就是单词的末尾
inline void insert(char* str,int x)
{
int p=0;
for(int i=0;str[i];i++){
int u=str[i]-'a';
if(!son[p][u]) son[p][u]=++idx;
p=son[p][u];
}
bs[p][x]=1;
}
inline void query(char* str)
{
int p=0;
for(int i=0;str[i];i++){
int u=str[i]-'a';
if(!son[p][u]){
cout<<' '<<endl;
return;
}
p=son[p][u];
}
for(int i=1;i<=n;i++){
if(bs[p][i]==1) cout<<i<<" ";
}
cout<<endl;
}
int main()
{
cin>>n;
//用迭代时因为还需要记录是第几篇文章
for(int i=1;i<=n;i++){
int len;
cin>>len;
//对每一段每一个单词进行读入
for(int j=1;j<=len;j++){
cin>>str;
insert(str,i);
}
}
cin>>m;
while(m--){
cin>>str;
query(str);
}
return 0;
}
依旧是简单的模板题目,不过这里强化了我对insert操作的认知,每次最后的p就是末尾,给这个末尾++就相当于记录,基本上所有的操作都是在单词末尾进行
而且加强了我对内存的认知,1mb=1e6字节,bitset<>[]是实现映射又节省内存的方法
以及如果要记得n处理的第几个的话应该用for,因为这样可以对每一个i操作