博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树
阅读量:6788 次
发布时间:2019-06-26

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

本来想找\(01Trie\)的结果找到了一堆字典树水题。。。算了算了当水个提交量好了。

直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点处的子树大小之和。

#include 
using namespace std;int top, sta[10010];int n, m, l, s[10010], max_size;int ch[500010][2], sz[500010], sum[500010];void push_up (int p) { sz[p] = sum[p]; if (ch[p][0]) sz[p] += sz[ch[p][0]]; if (ch[p][1]) sz[p] += sz[ch[p][1]];}void add_str () { int now = 0; sta[top = 1] = 0; for (int i = 1; i <= l; ++i) { if (!ch[now][s[i]]) { ch[now][s[i]] = ++max_size; } // printf ("ch[%d][%d] = %d\n", now, s[i], ch[now][s[i]]); now = ch[now][s[i]]; sta[++top] = now; } sz[now]++; sum[now]++; while (top > 0) push_up (sta[top--]);}int get_str () { int now = 0, ans = 0; for (int i = 1; i <= l; ++i) { if (!ch[now][s[i]]) { return ans; } // printf ("now = %d, sum[now] = %d sz[now] = %d\n", now, sum[now], sz[now]); now = ch[now][s[i]]; ans += sum[now]; } // printf ("now = %d\n", now); ans += sz[now] - sum[now]; return ans;}int main () { cin >> m >> n; for (int i = 1; i <= m; ++i) { scanf ("%d", &l); for (int j = 1; j <= l; ++j) { scanf ("%d", &s[j]); } add_str (); } for (int i = 1; i <= n; ++i) { scanf ("%d", &l); for (int j = 1; j <= l; ++j) { scanf ("%d", &s[j]); } cout << get_str () << endl; }}

转载于:https://www.cnblogs.com/maomao9173/p/10441309.html

你可能感兴趣的文章
【JAVA】字符串去空格
查看>>
CentOS操作系统中HTTP服务安装
查看>>
JBPM6教程-10分钟玩转JBPM工作台
查看>>
JS:证件检查类
查看>>
Nginx和Tomcat的管理脚本
查看>>
一种基于主客体模型的权限管理框架
查看>>
为什么我写的page页面无法渲染
查看>>
Impala/Hive现状分析与前景展望
查看>>
PHP读取PDF内容配合Xpdf的使用
查看>>
【Linux 驱动】设备驱动程序再理解
查看>>
加密解密的概念以及DES加密算法的实现
查看>>
yum 出现错误
查看>>
Nagios(十)—— 监控路由器
查看>>
禁止ping主机
查看>>
基于heartbeat v2 crm实现基于nfs的mysql高可用集群
查看>>
TensorFlow学习笔记-TensorBoard启动
查看>>
lduan SCO 2012 集成式部署(一)
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
我的友情链接
查看>>