博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷 P1666】 前缀单词 (Trie)
阅读量:5213 次
发布时间:2019-06-14

本文共 1163 字,大约阅读时间需要 3 分钟。

考试时暴搜50分。。。其实看到“单词”,“前缀”这种字眼时就要想到\(Trie\)的,哎,我太蒻了。

以一个虚点为根,建一棵\(Trie\),然后\(dfs\)
以当前点为根的答案就是\(Ans_u=(\prod_{\text{v是u的子树}}Ans_v)+\text{有单词以这个点结尾 ? 1 : 0}\),乘法原理嘛,如果有单词在这里结尾,那么就多一种情况:选这个单词且不选所有子树。
答案就是\(Ans_{\text{根}}\)

#include 
#include
#include
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;}

转载于:https://www.cnblogs.com/Qihoo360/p/9668694.html

你可能感兴趣的文章
hdu--1873--看病要排队
查看>>
C#实现Memcached分布式缓存,指定服务器保存变量
查看>>
Linux常用命令大全(分类)
查看>>
VS2005通过网络连接CE设备进行调试开发
查看>>
Video.js
查看>>
ASP.net和ASP的区别
查看>>
(转)计算机学科分类
查看>>
Google Maps API V3 之绘图库 信息窗口
查看>>
MySQL简介与安装
查看>>
web桌面
查看>>
MySql对日期的操作
查看>>
使用localStorage完成信息发布缓存
查看>>
征服世界
查看>>
Oracle 提示密码过期问题:the password will expire
查看>>
Android 隐藏输入软键盘
查看>>
Delphi Sysem.JSON 链式写法(转全能中间件)
查看>>
SqlServer触发器的理解
查看>>
AR/AP - 借项通知单和贷项通知单的区别
查看>>
工厂模式(Factory Pattern)
查看>>
redis----面试
查看>>