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)的主要内容,如果未能解决你的问题,请参考以下文章

LGOJ3879 TJOI2010 阅读理解

「字典树」[TJOI2010]阅读理解

P4592 [TJOI2018]异或 树链剖分 01trie

BZOJ5338 [TJOI2018] Xor 可持久化Trie树dfs序

P4592 [TJOI2018]异或 (可持久化Trie)

bzoj3172: [Tjoi2013]单词