P2922 [USACO08DEC]Secret Message G(Trie)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2922 [USACO08DEC]Secret Message G(Trie)相关的知识,希望对你有一定的参考价值。

P2922 [USACO08DEC]Secret Message G(Trie)

Trie 可用用于统计字符串的个数和前缀和匹配等问题。

题意:给定 m m m个文本串, n n n个模式串。

求每个模式串与多少个文本串的最大前缀相同。

m m m个文本串构造 T r i e Trie Trie,然后每次 O ( n ) O(n) O(n)查找即可。

T r i e Trie Trie时,维护两个变量,一个是经过该结点的次数 s s s,一个是以该结点为结尾的字符串个数 e d ed ed

然后计算贡献的时候,跑一遍字符串即可,每次加上ed,若没遍历完则此时的sum就是答案,否则还要加上a[p].s-a[p].ed,a[p].s包括了a[p].ed,而a[p].ed之前被统计过,所以只需加上真前缀为该模式串的文本串个数。

code

// Problem: P2922 [USACO08DEC]Secret Message G
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2922
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-07-06 15:48:40
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=5e4+5,M=5e5+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 nt[2],s,ed;
}a[M];
int b[N],len,cnt;
void ins(){
	int p=0;
	for(int j=1;j<=len;j++){
		if(!a[p].nt[b[j]]) a[p].nt[b[j]]=++cnt;
		p=a[p].nt[b[j]];
		a[p].s++;
	}
	a[p].ed++;
}
ll que(){
	ll ans=0;
	int p=0;
	bool ok=true;
	for(int i=1;i<=len;i++){
		if(!a[p].nt[b[i]]){
			ok=0;break;
		} 
		p=a[p].nt[b[i]];
		ans+=a[p].ed;
	}
	return ok?ans+a[p].s-a[p].ed:ans;
}
int main(){
	int n,m;scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++){
		scanf("%d",&len);
		for(int j=1;j<=len;j++) scanf("%d",&b[j]);
		ins();
	}
	for(int i=1;i<=n;i++){
		scanf("%d",&len);
		for(int j=1;j<=len;j++) scanf("%d",&b[j]);
		printf("%lld\\n",que());
	}
	return 0;
}

以上是关于P2922 [USACO08DEC]Secret Message G(Trie)的主要内容,如果未能解决你的问题,请参考以下文章

P2922 [USACO08DEC]秘密消息Secret Message

P2922 [USACO08DEC]秘密消息Secret Message

洛谷 P2922 [USACO08DEC]秘密消息Secret Message

P2922 [USACO08DEC]秘密消息Secret Message

P2922 [USACO08DEC]Secret Message G(Trie)

P2922 [USACO08DEC]秘密消息Secret Message