P3879 [TJOI2010]阅读理解(Trie)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3879 [TJOI2010]阅读理解(Trie)相关的知识,希望对你有一定的参考价值。
P3879 [TJOI2010]阅读理解(Trie)
比较水,就是找一下模式串在哪些文本串里出现过,并且按顺序输出出现过的序号。
用个set搞下就可以了。
code
// Problem: P3879 [TJOI2010]阅读理解
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3879
// Memory Limit: 125 MB
// Time Limit: 2000 ms
// Date: 2021-07-06 16:11:55
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=5e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
struct node{
int ch[26];
bitset<1005>vis;
}a[N];
int cnt;
int n,m;
void ins(string &s,int id){
int p=0;
for(char c: s){
int x=c-'a';
if(!a[p].ch[x]) a[p].ch[x]=++cnt;
p=a[p].ch[x];
}
a[p].vis[id]=1;
}
void que(string &s){
int p=0;
bool ok=1;
for(char c:s){
int x=c-'a';
if(!a[p].ch[x]){
printf("\\n");return;
}
p=a[p].ch[x];
}
int f=0;
for(int i=1;i<=n;i++)
if(a[p].vis[i]){
if(!f) printf("%d",i),f=1;
else printf(" %d",i);
}
printf("\\n");
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
for(int j=1;j<=x;j++){
string s;cin>>s;
ins(s,i);
}
}
scanf("%d",&m);while(m--){
string s;cin>>s;
que(s);
}
return 0;
}
以上是关于P3879 [TJOI2010]阅读理解(Trie)的主要内容,如果未能解决你的问题,请参考以下文章
P4592 [TJOI2018]异或 树链剖分 01trie