HDU 4117 GRE Words

这道题不难想到这样的dp。

dp[字符串si] = 以si为结尾的最大总权值。

dp[si] = max(dp[sj]) ,1.j < i,2.sj是si的子串。

对于第二个条件,是一个多模版串匹配的问题,可以用AC自动机。

预先O(m)把AC自动机建好,然后动态更新AC自动机上的dp值,

匹配的时候,指向字符的指针移动总共是O(m),

而每个单词,fail指针走寻找后缀却是O(m),即使改成后缀链接也是O(n)。too slow!

找到一个单词后,需要避免找后缀,动态维护这个单词的dp值。

一开始所有单词的dp都是0。

更新的时候,dp[si]需要更新所有dp[sj],其中si是sj的后缀。

如果父节点是子节点的后缀,把所有的单词(包括空后缀)连接起来将会得到以空字符串为根的后缀链接树。

这样就变成一个更新子树的问题,dfs把树形转成线性以后可以用线段树来维护。

询问单点最大值,区间更新O(logn)。

复杂度O(mlogn)

潜在的坑点:

1.Trie个结点可能对应多个单词,如果只更新了其中一个单词的线性区间RE...(map,前向链表,vector都可以搞

 

/*********************************************************
*            ------------------                          *
*   author AbyssFish                                     *
**********************************************************/
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;const int LEN = 3e5+5;
const int MAXN = 2e4+5;int W[MAXN], S[MAXN];
int N;
char s[LEN];int hd[LEN];
int nx[MAXN], to[MAXN], ec;void add_e(int u,int v)
{to[ec] = v;nx[ec] = hd[u];hd[u] = ec++;
}
#define eachedge int i = hd[u]; ~i; i = nx[i]
inline void init_g(int n){ memset(hd,-1,n<<2); ec = 0; }
int L[MAXN], R[MAXN], dfs_clk; //string's linear suffix link tree id
const int ST_SIZE = 1<<16;
int dp[ST_SIZE];#define para int o = 1,int l = 0,int r = dfs_clk
#define lo (o<<1)
#define ro (o<<1|1)
#define Tvar int md = (l+r)>>1;
#define lsn lo,l,md
#define rsn ro,md,r
#define insd ql<=l&&r<=qrvoid build(para)
{dp[o] = 0;if(r-l>1){Tvarbuild(lsn);build(rsn);}
}void update(int ql,int qr,int v,para)
{if(insd){dp[o] = max(dp[o],v);}else {Tvarif(ql < md) update(ql,qr,v,lsn);if(qr > md) update(ql,qr,v,rsn);}
}int query(int p,para)
{int re = 0;while(r-l>1){Tvarif(p<md){o = lo; r = md;}else {o = ro; l = md;}re = max(re,dp[o]);}return re;
}const int sigma_size = 26, MAXND = LEN;
struct AhoCorasick_automata
{#define idx(x) (x-'a')int ch[MAXND][sigma_size];int f[MAXND];int last[MAXND];int cnt;int val[MAXND];int nx_val[MAXN];void add_v(int o,int x){nx_val[x] = val[o];val[o] = x;}int newNode(){int i = ++cnt;memset(ch[i],0,sizeof(ch[i]));val[i] = 0;return i;}void init(){cnt = -1; newNode();}int add(char *s,int id){int u = 0, i, c;for(i = 0; s[i]; i++){c = idx(s[i]);if(!ch[u][c]){ch[u][c] = newNode();}u = ch[u][c];}add_v(u,id);return i;}queue<int> q;void getFail(){int u, c, v, r;//f[0] = 0; last[0] = 0;for(c = 0; c < sigma_size; c++){u = ch[0][c];if(u){q.push(u);f[u] = 0;last[u] = 0;}}while(!q.empty()){r = q.front(); q.pop();for(c = 0; c < sigma_size; c++){u = ch[r][c];if(u){q.push(u);v = f[u] = ch[f[r]][c];last[u] = val[v] ? v : last[v];}else ch[r][c] = ch[f[r]][c];}}}void dfs(int u){int le = dfs_clk++;for(eachedge){dfs(to[i]);}int ri = dfs_clk;for(int id = val[u]; id; id = nx_val[id]){L[id] = le; R[id] = ri;}}void buildTree(){init_g(cnt+1);for(int u = 1; u <= cnt; u++)if(val[u]){add_e(last[u],u);}dfs_clk = 0;dfs(0);}void work(){int i,j,c,u,id;int ans = 0, mx;build();for(i = 1; i <= N; i++){u = 0; mx = 0;for(j = S[i-1]; j < S[i]; j++){c = idx(s[j]);u = ch[u][c];if(val[u]){id = val[u];mx = max(mx, query(L[id]));}else if(last[u]){id = val[last[u]];mx = max(mx, query(L[id]));}}if(W[i] > 0){ans = max(ans, mx += W[i]);update(L[i],R[i],mx);}}printf("%d\n",ans);}}ac;void solve()
{scanf("%d",&N);ac.init();for(int i = 1; i <= N; i++){scanf("%s%d",s+S[i-1],W+i);S[i] = ac.add(s+S[i-1],i)+S[i-1];}ac.getFail();ac.buildTree();ac.work();
}//#define LOCAL
int main()
{
#ifdef LOCALfreopen("data.txt","r",stdin);
#endifint T, kas = 0; scanf("%d",&T);while(++kas <= T){printf("Case #%d: ",kas);solve();}return 0;
}

 

转载于:https://www.cnblogs.com/jerryRey/p/5051900.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十四、CSS 3新特性详解(二)——2D转换(transform)、动画(animation)、动画序列

HTML5 第二天 一、rotate 2d旋转指的是让元素在2维平面内顺时针旋转或者逆时针旋转 使用步骤&#xff1a; 给元素添加转换属性 transform属性值为 rotate(角度) 如 transform:rotate(30deg) 顺时针方向旋转30度 div{transform: rotate(0deg); }二、三角 <!DOCTYPE html&…

pip/conda导出 requirements.txt 注意事项

pip 使用 pip freeze > ./requirements.txt 导出 requirements.txt 发现很多包没有版本号&#xff0c;而是 file:/// 使用pip list --formatfreeze > ./requirements.txt 导入安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt con…

计算机系统操作在线作业,电子科大《计算机操作系统》在线作业3

计算机操作,计算机网络14春13秋 13春电子科大《计算机操作14春13秋 13春电子科大《计算机操作系统》在线作业3 1 2试卷总分&#xff1a;100 测试时间&#xff1a;--单选题、单选题(共 20 道试题&#xff0c;共 100 分。)1. 在下列性质中,哪一个是分时系统的特征()。A. 多路性B.…

fortune命令简介

本文转自《阮志峰的网络日志》&#xff0c;原文网址&#xff1a;http://www.ruanyifeng.com/blog/2015/04/fortune.html 作者&#xff1a; 阮一峰 日期&#xff1a; 2015年4月14日 美国中餐馆的最后一道菜&#xff0c;往往是小甜饼&#xff0c;叫做"幸运饼"&#xff…

conda安装pytorch1.10.1+paddlepaddle-gpu2.2.1+cuda10.2+cudnn7.6.5

NV驱动下载安装https://www.nvidia.cn/Download/index.aspx多卡的话&#xff0c;安装 NCCL https://developer.nvidia.com/nccl/nccl-download安装conda&#xff0c;并配置通道 vim ~/.condarc show_channel_urls: truessl_verify: truechannels:- https://mirrors.tuna.tsing…

十五、CSS 3新特性详解(三)——3D转换(位移、旋转、呈现)、透视perspective、旋转rotateX、Y、Z、呈现transform-style

HTML5 第三天 一、 认识 3D 转换 3D 的特点 近大远小物体和面遮挡不可见 三维坐标系 x 轴&#xff1a;水平向右 – 注意&#xff1a;x 轴右边是正值&#xff0c;左边是负值 y 轴&#xff1a;垂直向下 – 注意&#xff1a;y 轴下面是正值&#xff0c;上面是负值 z 轴&#x…

用计算机表白的数字,用数字表白的句子大全 如何用数字表白一段话

表白总是一个让人十分难忘的经历&#xff0c;如果大家想要对喜欢的人表白&#xff0c;又不好意思直说自己的想法&#xff0c;那么今天的这份用数字表白的句子大全就对你们很有帮助了。跟我一起看看&#xff0c;如何用数字表白一段话呢&#xff1f;一、用数字表白的句子大全1、3…

python 常用 time, datetime处理

python 中 time 有三种格式&#xff1a; float, struct tuple(time.struct_time 或 datetime.datetime), str 常用的&#xff1a; float --> struct tuple: time.localtime( float ) struct time tuple --> str: time.strftime(format, struct time tuple) str --> …

pip安装pytorch1.10.1+paddlepaddle-gpu2.2.1+cuda10.2+cudnn7.6.5

NV驱动下载安装https://www.nvidia.cn/Download/index.aspx多卡的话&#xff0c;安装 NCCL https://developer.nvidia.com/nccl/nccl-download配置 pip 源 vim ~/.pip/pip.conf [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple安装virtualenv包pip install vir…

jQuery学习笔记系列(一)——入口函数,jQuery对象和DOM对象,jQuery选择器、样式操作、效果(显示隐藏、滑入滑出、淡入淡出、自定义动画、停止动画队列)

day01 - jQuery 学习目标&#xff1a; 能够说出什么是 jQuery 能够说出 jQuery 的优点 能够简单使用 jQuery 能够说出 DOM 对象和 jQuery 对象的区别 能够写出常用的 jQuery 选择器 能够操作 jQuery 样式 能够写出常用的 jQuery 动画 1.1. jQuery 介绍 1.1.1 JavaScript 库 ​…

计算机主机显卡安装,安装后如何在计算机中启用独立显卡

如今&#xff0c;许多朋友对他们的计算机配置不满意&#xff0c;希望将计算机配置提高一些. 现在&#xff0c;我将告诉您如何设置带有高性能图形卡的笔记本电脑.详细信息如下:1. 第一步&#xff0c;在打开计算机电源后&#xff0c;右键单击桌面&#xff0c;然后在出现的菜单中显…

RHadoop和CDH整合实例(三)- RHive

五、 RHive的安装及测试 RHive依赖于Rserve&#xff0c;所有首先需要安装Rserve(在各个namenode上)&#xff0c;接下来在所有节点上启动Rserve&#xff1a; > sudo R > install.packages("Rserve") > q() > Rserve --RS-conf /usr/lib64/R/Rserv.…

LeetCode 2144. 打折购买糖果的最小开销(贪心)

文章目录1. 题目2. 解题1. 题目 一家商店正在打折销售糖果。每购买 两个 糖果&#xff0c;商店会 免费 送一个糖果。 免费送的糖果唯一的限制是&#xff1a;它的价格需要小于等于购买的两个糖果价格的 较小值 。 比方说&#xff0c;总共有 4 个糖果&#xff0c;价格分别为 1…

在微型计算机中8m,第一部分 计算机基础知识部分习题(答案)

A)bit B)Byte C)bout D)baud95. 目前用于计算机的光盘有三大类&#xff1a;只读光盘、一次性写入光盘和_____C_____A)CD-ROM B)多媒体光盘C)可擦写光盘D)随机光盘96. 要将整屏幕打印出来应按___C_______.A)B)< Printscreen >C)< Printscreen > D)97. 与二进制数010…

淘宝弹性布局方案lib-flexible实践

2个月前&#xff0c;写过一篇文章《从网易与淘宝的font-size思考前端设计稿与工作流》总结过一些移动web中有关手机适配的一些思路&#xff0c;当时也是因为工作的关系分析了下网易跟淘宝的移动页面&#xff0c;最后才有那篇文章的总结&#xff0c;可惜的是因为项目的关系&…

jQuery学习笔记系列(二)

day02 - jQuery 学习目标&#xff1a; 能够操作 jQuery 属性 能够操作 jQuery 元素 能够操作 jQuery 元素尺寸、位置 1.1. jQuery 属性操作 ​ jQuery 常用属性操作有三种&#xff1a;prop() / attr() / data() ; 1.1.1 元素固有属性值 prop() ​ 所谓元素固有属性就是元素本…

LeetCode 2145. 统计隐藏数组数目(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始且长度为 n 的整数数组 differences &#xff0c;它表示一个长度为 n 1 的 隐藏 数组 相邻 元素之间的 差值 。 更正式的表述为&#xff1a;我们将隐藏数组记作 hidden &#xff0c;那么 differences[i] hidden[i 1] -…

飞思卡尔imx7 html5,i.MX6UL 飞思卡尔即将发布基于ARM Cortex-A7核心的低功耗处理器 i.MX 6UltraLite Processor...

i.MX6UL 飞思卡尔即将发布基于ARM Cortex-A7核心的低功耗处理器 i.MX 6UltraLite ProcessorFreescale飞思卡尔即将于7月份发布全新的基于ARM Cortex-A7核心的低功耗处理器i.MX6UL&#xff0c;主要面向车载信息处理、家庭能源管理系统、工控领域、物联网网关等应用。i.MX6UL是一…

简单table分页

html <table id"pagingTable"><thead><tr><td>第一列</td><td>第二列</td><td>第三列</td><td>第四列</td><td>第五列</td></tr></thead><tbody><tr><td…

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器&#xff1a; 二、由两个半加器构成的1-bit全加器&#xff1a; 注意&#xff1a;下图中所使用的四个1-bit全加器&#xff08;也就是正方形区域&#xff09;都是经过了封装的&#xff0c;所以外观与上图中的1-bit全加器有所区别&#…