[BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)

Posted 蒟蒻zht的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)相关的知识,希望对你有一定的参考价值。

传送门

 

看到前缀就要想到字典树!

看到前缀就要想到字典树!

看到前缀就要想到字典树!

 

#include <cstdio>
#include <iostream>
#define N 500001

int n, m, k, cnt;
int a[N], val[N], num[N], next[N][2];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
	return x * f;
}

inline void insert()
{
	int i, now = 0;
	for(i = 1; i <= k; i++)
	{
		if(!next[now][a[i]])
			next[now][a[i]] = ++cnt;
		now = next[now][a[i]];
		num[now]++;
	}
	val[now]++;
}

inline int query()
{
	int i, now = 0, ans = 0;
	for(i = 1; i <= k; i++)
	{
		if(!next[now][a[i]])
			return ans;
		now = next[now][a[i]];
		ans += val[now];
	}
	return ans + num[now] - val[now];
}

int main()
{
	int i, j;
	n = read();
	m = read();
	for(i = 1; i <= n; i++)
	{
		k = read();
		for(j = 1; j <= k; j++) a[j] = read();
		insert();
	}
	for(i = 1; i <= m; i++)
	{
		k = read();
		for(j = 1; j <= k; j++) a[j] = read();
		printf("%d\n", query());
	}
	return 0;
}

  

以上是关于[BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 1590.Secret Message 秘密信息(Trie树) [Usaco2008 Dec]BZOJ计划

[BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)

BZOJ1590: [Usaco2008 Dec]Secret Message 秘密信息

BZOJ1590: [Usaco2008 Dec]Secret Message 秘密信息

bzoj1590Usaco2008 Dec秘密消息Secret Message

bzoj 1606 [Usaco2008 Dec]Hay For Sale 购买干草 01背包