[一本通1700]PFS集合
题目描述
有一种特殊的集合叫做PFS(Prefix Free Set)集合。
一个PFS集合由若干字符串构成,且不存在一个字符串是另一个字符串的前缀。空集也被看作是PFS集合。
例如 {\("hello"\)} 和 {\("hello", "goodbye", "giant", "hi"\)} 是PFS集合,但 {\("hello","hell"\)} 和{\("great","gig","g"\)} 不是。
现在给你一个集合,请你求出它的子集是PFS集合的子集个数,答案对\(9191\)取模。
输入
输入数据第一行一个整数\(n\),表示集合里元素的个数。
以下n行,每行一个非空字符串\(s\),仅包含小写英文字母,表示集合中的元素。数据保证不存在两个相同的字符串。
输出
输出一个正整数\(ans\),表示对\(9191\)取模后的答案。
输入样例
3
hello
hi
hell
输出样例
6
提示
输入输出样例解释
除了 {\("hell","hello"\)} 和 {\("hi","hello","hell"\)} 两种情况外,其余情况均是PFS集合。
数据规模
对于\(30%\)的数据,\(n≤20\);
对于\(100%\)的数据,\(1≤n≤50000\),字符串长度不大于\(50\)。
思路
\(f[i]+=f[ch[i][1]]\times f[ch[i][2]]\times \cdots\times f[ch[i][26]]\)
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 2500000 + 128;
int to[N][26];
int p;
int cnt[N];
int f[N];
void dfs(int u)
{
int ans = 1;
for (int i = 0; i < 26; i++)
if (to[u][i])
{
dfs(to[u][i]);
ans = ans * f[to[u][i]] % 9191;
}
f[u] = ans;
if (cnt[u])
f[u]++;
}
static char str[50016];
int main()
{
int n;
scanf(" %d", &n);
getchar();
++p;
for (int i = 1; i <= n; i++)
{
scanf(" %s", str + 1);
int len = strlen(str + 1);
int now = 1;
for (int i = 1; i <= len; i++)
{
if (to[now][str[i] - 'a'] == 0)
to[now][str[i] - 'a'] = ++p;
now = to[now][str[i] - 'a'];
}
cnt[now] = 1;
}
dfs(1);
printf("%d", f[1] % 9191);
return 0;
}
[一本通1700]PFS集合的更多相关文章
- [SQL] SQL 基础知识梳理(七)- 集合运算
SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 ...
- HEOI2018(九省联考) 题解集合
转载请注明出处:http://www.cnblogs.com/LadyLex/p/8792894.html 今年的省选题目真是赞啊……Day2的题完全不会做…… 不过终于卡着校线爬着进了B队 终于改完 ...
- 生成二维码 加密解密类 TABLE转换成实体、TABLE转换成实体集合(可转换成对象和值类型) COOKIE帮助类 数据类型转换 截取字符串 根据IP获取地点 生成随机字符 UNIX时间转换为DATETIME\DATETIME转换为UNIXTIME 是否包含中文 生成秘钥方式之一 计算某一年 某一周 的起始时间和结束时间
生成二维码 /// <summary>/// 生成二维码/// </summary>public static class QRcodeUtils{private static ...
- 7 SQL 集合运算
7 集合运算 7-1 表的加减法 本章将会和大家一起学习“集合运算”操作.在数学领域,“集合”表示“(各种各样的)事物的总和”:在数据库领域,表示“记录的集合”.具体来说,表.视图和查询的执行结果都是 ...
- C# Tuple 创建一个新二元集合
List<string> list1=new List<string>(); List<string> list2=new List<string>() ...
- 集合运算(UNION)
表的加法 集合运算:就是满足统一规则的记录进行的加减等四则运算. 通过集合运算可以得到两张表中记录的集合或者公共记录的集合,又或者其中某张表中记录的集合. 集合运算符:用来进行集合的运算符. UNIO ...
- 深浅拷贝、集合set、函数、日志
#-----深浅拷贝---- import copy a = ["xiaoming",111,[5000,2000]] b = a print("b:%s" % ...
- Java集合--TreeMap
转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 TreeMap介绍 TreeM ...
- [一本通学习笔记] 最近公共祖先LCA
本节内容过于暴力没什么好说的.借着这个专题改掉写倍增的陋习,虽然写链剖代码长了点不过常数小还是很香. 10130. 「一本通 4.4 例 1」点的距离 #include <bits/stdc++ ...
- [一本通学习笔记] AC自动机
AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现 ...
随机推荐
- 如何在矩池云使用 Poetry 管理项目环境
官网介绍:Poetry is a tool for dependency management and packaging in Python. It allows you to declare th ...
- javascript浮点数相减、相乘出现一长串小数
149.7 * 100 = 14969.999999999998 3.57 - 2.33 = 1.2399999999999998 这是JavaScript浮点运算采用IEEE 754标准导致的Bug ...
- 【Azure Function】Azure Function中使用 Java 8 的安全性问题
问题描述 使用Azure Function, 环境是Linux的Java8.目前 Oracle Java JDK8,11,17 和 OpenJDK 8/11/17 都在存在漏洞受影响版本的范围内. O ...
- 【Azure App Service】如何来停止 App Service 的高级工具站点 Kudu ?
问题描述 如何来停止 App Service 的高级工具站点 Kudu ? kudu 介绍 Kudu 提供了一组面向开发人员的工具和扩展点,用于您的应用服务应用程序. Kudu (Advanced T ...
- 【Azure K8S | AKS】在中国区AKS上遇见ImagePullBackOff时的替代方案
问题描述 在AKS集群中部署calico时候,遇见 ImagePullBackOff 问题. 在创建POD calico-typha-horizontal-autoscale 时候遇见拉取镜像失败问题 ...
- 使用debezium实现cdc实时数据同步功能记录
Debezium 是一个用于变更数据捕获的开源分布式平台.能够保证应用程序就可以开始响应其他应用程序提交到您数据库的所有插入.更新和删除操作.Debezium 持久.快速,因此即使出现问题,您的应用程 ...
- 解密Spring中的Bean实例化:推断构造方法(上)
在Spring中,一个bean需要通过实例化来获取一个对象,而实例化的过程涉及到构造方法的调用.本文将主要探讨简单的构造推断和实例化过程,让我们首先深入了解实例化的步骤. 实例化源码 protecte ...
- vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码
vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码
- 学习笔记-涛讲F#(基础 II)
目录 处理一堆数 组织代码(命名空间.模块) 使用联合重命名类型 类必须显式转换成接口 对象表达式 递归函数 CPS解决堆栈溢出 扩展一个类型 静态解析的类型参数 ref变量的实现原理及应用 F#资源 ...
- stm32 fatfs 文件系统分析和代码解析
一 文件系统: 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构:即在存储设备上组织文件的方法.操作系统中负责管理和存储文件信息 ...