PFS集合

Posted cutemush

tags:

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


有一种特殊的集合叫做PFS(Prefix Free Set)集合。
一个PFS集合由若干字符串构成,且不存在一个字符串是另一个字符串的前缀。空集也被看作是PFS集合。
例如 {"hellohello"} 和 {"hellohello", "goodbyegoodbye", "giantgiant", "hihi"} 是PFS集合,但 {"hellohello","hellhell"} 和{"greatgreat","giggig","gg"} 不是。
现在给你一个集合,请你求出它的子集是PFS集合的子集个数,答案对9191取模。
Input
输入数据第一行一个整数n,表示集合里元素的个数。
以下n行,每行一个非空字符串s,仅包含小写英文字母,表示集合中的元素。数据保证不存在两个相同的字符串。
1≤n≤50000,字符串长度不大于50
Output
输出一个正整数ans,表示对9191取模后的答案。
Sample Input
3
hello
hi
hell
Sample Output
6
HINT
//除了 {"hellhell","hellohello"} 和 {"hihi","hellohello","hellhell"} 两种情况外,其余情况均是PFS集合

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cctype>
using namespace std;
inline void read(int& x)
{
	char c = getchar();x = 0;
	while(!isdigit(c))c=getchar();
	while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}
}
int n,tot;char s[55];
int trie[1100000][27];
int v[1100000];
void insert()
{
	int u = 0;
	int len = strlen(s);
	for(int i=0;i<len;i++)
	{
		int c = s[i]-‘a‘+1;
		if(!trie[u][c])
			trie[u][c]=++tot;
		u = trie[u][c];
	}
	v[u] = 1;	
}
int dfs(int u)
{
	int sum = 1;
	for(int i=1;i<=26;i++)
	{
		if(trie[u][i])
		{
			int k = dfs(trie[u][i]);
			sum*=k;
			sum%=9191;
		}
	}
	v[u]+=sum;
	v[u]%=9191;
	return v[u];
}
int main(void)
{
	read(n);
	for(int i=1;i<=n;i++){gets(s);insert();}
	printf("%d",dfs(0));
	return 0;
}

  

以上是关于PFS集合的主要内容,如果未能解决你的问题,请参考以下文章

laravel特殊功能代码片段集合

SQLSERVER 阻塞之 PFS 页到底是什么?

SQLSERVER 阻塞之 PFS 页到底是什么?

PrimeFaces 选择器 (PFS) 使用属性包含选择器 [name*=”value”]

Pfs Pachyderm:容器化的数据池

鍒嗗竷寮忓瓨鍌↖PFS鏁板瓧璧勪骇