码迷,mamicode.com
首页 > 其他好文 > 详细

PFS集合

时间:2020-03-30 23:05:13      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:ODB   free   void   特殊   整数   长度   get   字符串长度   sum   


有一种特殊的集合叫做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集合

标签:ODB   free   void   特殊   整数   长度   get   字符串长度   sum   

原文地址:https://www.cnblogs.com/cutemush/p/12601736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!