【洛谷 P1666】 前缀单词 (Trie)
考试时暴搜50分。。。其实看到“单词”,“前缀”这种字眼时就要想到\(Trie\)的,哎,我太蒻了。
以一个虚点为根,建一棵\(Trie\),然后\(dfs\),
以当前点为根的答案就是\(Ans_u=(\prod_{\text{v是u的子树}}Ans_v)+\text{有单词以这个点结尾 ? 1 : 0}\),乘法原理嘛,如果有单词在这里结尾,那么就多一种情况:选这个单词且不选所有子树。
答案就是\(Ans_{\text{根}}\)
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define Open(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout);
#define Close fclose(stdin);fclose(stdout);
int n;
char a[60];
struct Trie{
Trie *son[27];
int p;
}*root = new Trie();
inline void Insert(){
int len = strlen(a + 1);
Trie *now = root;
for(int i = 1; i <= len; ++i){
if(now->son[a[i] - 'a'] == NULL)
now->son[a[i] - 'a'] = new Trie(), now->son[a[i] - 'a']->p = 0;
now = now->son[a[i] - 'a'];
}
now->p = 1;
}
long long dp(Trie *now){
long long sum = 1;
for(int i = 0; i < 26; ++i)
if(now->son[i] != NULL){
sum *= dp(now->son[i]);
}
return sum + now->p;
}
int main(){
Open("prefix");
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%s", a + 1), Insert();
printf("%lld\n", dp(root));
return 0;
}
【洛谷 P1666】 前缀单词 (Trie)的更多相关文章
- 洛谷 P1666 前缀单词 题解
题意:给n个单词,如果单词a为单词b的前缀则a,b不能共存,问能共存的集合数(包括空集) 一道dp题,排序后判断,f[i][j]表示i和j是否能共存,f[i][j]=1表示能共存,初始化dp[i]=1 ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- P1666 前缀单词
P1666 前缀单词 tire树上跑dp 首先将trie树建出来,然后对于每个节点.考虑他的子节点. 子节点的方案数都互不干扰,所以子节点与其他子节点的的方案数可以利用乘法原理算出来. 然后如果这个节 ...
- Luogu1738 | 洛谷的文件夹 (Trie+STL)
题目描述 kkksc03是个非凡的空想家!在短时间内他设想了大量网页,然后总是交给可怜的lzn去实现. 洛谷的网页端,有很多文件夹,文件夹还套着文件夹. 例如:\(/luogu/application ...
- 洛谷.3065.第一!First!(Trie 拓扑)
题目链接 \(Description\) 给出n个字符串,问重定义英文字符的顺序(即字典序),有哪些单词可能排在第一 \(Solution\) 一个单词想要排在第一,首先是没有其它字符串是它的前缀.那 ...
- 洛谷 P2353 背单词
题目背景 小明对英语一窍不通,令老师十分头疼.于是期末考试前夕,小明被逼着开始背单词…… 题目描述 老师给了小明一篇长度为N的英语文章,然后让小明背M个单词.为了确保小明不会在背单词时睡着,老师会向他 ...
- 【luogu P1666 前缀单词】 题解
题目链接:https://www.luogu.org/problemnew/show/P1666 10.13考试题 当时没想出来,觉得是要用trie做,在trie上跑一个树形dp 结果是写了个子集枚举 ...
- 洛谷P3966 [TJOI2013]单词(fail树性质)
P3966 [TJOI2013]单词 题目链接:https://www.luogu.org/problemnew/show/P3966 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单 ...
- P1666前缀单词
题目传送门点我传送 Ⅰ.字典树+树型DP 非常奇妙的一种解法 第一部分:构建树 先对来的单词读入,插入字典树 然后对于一颗字典树,其实是有很多无用边的,所以我们需要删去一些边 删去非单词节点和非单词节 ...
随机推荐
- Extjs报错:isField为空或不是对象
在做Extjs开发的时候,有时候会碰到一个奇怪的问题,就是报错说"isField为空或不是对象",经过调试发现是一个数组,显示的长度是21,但是数组里面的个数只有 ...
- unity3d easytouch计算摇杆旋转角度以及摇杆八方向控制角色
在写第三人称控制的时候,一开始在电脑测试是用WASD控制角色 后来需要发布到手机上,于是就加了一个摇杆 键盘控制角色的代码已经写好了,角色八方向移动 如果按照传统的大众思路来控制的话,是达不到我想要的 ...
- 「Haskell 学习」一 环境与大致了解
感谢<Real World Haskell>在网上的免费发布,可以白嫖学Haskell这个久闻大名的函数式编程语言了. 本文运行于openSUSE Tumbleweed下,运行相关命令时留 ...
- Qt 在Label上面绘制罗盘
自己写的一个小小的电子罗盘的一个小程序,不过是项目的一部分,只可以贴绘制部分代码 效果如下图 首先开始自己写的时候,虽然知道Qt 的坐标系是从左上角开始的,所以,使用了算法,在绘制后,在移动回来,但是 ...
- Windows Server 2008 R2 WEB 服务器安全设置指南
http://wenku.baidu.com/view/9b66c51449649b6649d747a2.html?from=search http://wenku.baidu.com/view/84 ...
- 常见 SQL语句使用 增删改查
一.常见的增删改查(一).查:1.SELECT 列名称 FROM 表名称,其中列名可以是多个,中间用豆号分开,如SELECT LastName,FirstName FROM Persons: 2.SE ...
- linux备忘录-系统服务daemon
服务(daemon)及其分类 Linux中的服务被称为daemon(daemon是守护神,恶鬼的意思哦).这些daemon会常驻在内存当中,从而对我们的系统和任务等进行一些辅助性的工作.实际上,dae ...
- HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)
Problem Description Mex is a function on a set of integers, which is universally used for impartial ...
- android桌面悬浮窗仿QQ手机管家加速效果
主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗 ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...
- IE图片下载
之前要用到图面下载功能,玩上找了好多,方法基本都是直接window.open(src),这样是直接在新打开的窗口中打开图片,并不是下载.考虑到IE的兼容性问题太难找了,好不容易找到一个能用的,所以保存 ...