bzoj 2905 背单词

Description

给定一张包含N个单词的表,每个单词有个价值W。要求从中选出一个子序列使得其
中的每个单词是后一个单词的子串,最大化子序列中W的和。 
 

Input

第一行一个整数TEST,表示数据组数。 
接下来TEST组数据,每组数据第一行为一个整数N。 
接下来N行,每行为一个字符串和一个整数W。 

Output

TEST行,每行一个整数,表示W的和的最大值。 
 
 
数据规模 
设字符串的总长度为Len 
30.的数据满足,TEST≤5,N≤500,Len≤10^4 
100.的数据满足,TEST≤10,N≤20000,Len≤3*10^5

题解
首先对所有单词建AC自动机。另一个串是一个串的子串等价于这个串的任意前缀能够通过fail树到根的路径上走到另一个串。
我们用f[i]表示一定选i这个串的最大收益。
则f[i] = max(前缀能在fail树上走到的最大收益) + w[i]
用线段树维护fail树的dfs序,区间修改,单点查询
处理完每一个单词后直接在这个单词对应节点处加上f[i],相当于对于它的子树中所有点的答案取一个max
时间复杂度O(LlogL)
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 #define maxn 300020
  7 
  8 typedef long long ll;
  9 struct node{
 10     int ls,rs;
 11     ll mx,tag;
 12 }sgt[maxn * 2];
 13 struct node2{
 14     int next,to;
 15 }e[maxn * 2];
 16 int head[maxn],cnt;
 17 char ch[maxn];
 18 int T,n;
 19 int nxt[maxn][26],tot,dfstime,fa[maxn];
 20 int fail[maxn],rt,cur,l[maxn],r[maxn],rec[maxn],w[maxn];
 21 int q[maxn],tt,hh;
 22 ll f[maxn],ans;
 23 
 24 inline void clear(){
 25     for (int i = 1 ; i <= n ; i++) f[i] = 0;
 26     for (int i = 0 ; i <= tot ; i++) fail[i] = l[i] = r[i] = head[i] = fa[i] = rec[i] = 0;
 27     for (int i = 1 ; i <= tot ; i++) e[i].next = e[i].to = 0;
 28     for (int i = 0 ; i <= tot ; i++) memset(nxt[i],0,sizeof(nxt[i]));
 29     for (int i = 1 ; i <= cnt ; i++) sgt[i].tag = sgt[i].mx = 0 , sgt[i].ls = sgt[i].rs = 0;
 30     tot = cnt = dfstime = 0;
 31     ans = 0;
 32 }
 33 inline void adde(int x,int y){
 34     e[++cnt].to = y;
 35     e[cnt].next = head[x];
 36     head[x] = cnt;
 37 }
 38 inline void insert(int x){
 39     if ( !nxt[cur][x] ) nxt[cur][x] = ++tot , fa[tot] = cur;
 40     cur = nxt[cur][x];
 41 }
 42 void dfs(int x){
 43     if ( x ) l[x] = ++dfstime;
 44     for (int i = head[x] ; i ; i = e[i].next) dfs(e[i].to);
 45     r[x] = dfstime;
 46 }
 47 void build(int &x,int l,int r){
 48     x = ++cnt;
 49     if ( l == r ) return;
 50     int mid = (l + r) >> 1;
 51     build(sgt[x].ls,l,mid);
 52     build(sgt[x].rs,mid + 1,r);
 53 }
 54 void build_AC(){
 55     tt = hh = 0;
 56     for (int i = 0 ; i < 26 ; i++) if ( nxt[0][i] ) q[tt++] = nxt[0][i];
 57     while ( hh < tt ){
 58         int x = q[hh++];
 59         for (int i = 0 ; i < 26 ; i++){
 60             if ( nxt[x][i] ){
 61                 int p = fail[x];
 62                 while ( !nxt[p][i] && p ) p = fail[p];
 63                 fail[nxt[x][i]] = nxt[p][i]; //不是p
 64                 q[tt++] = nxt[x][i];
 65             }
 66         }
 67     }
 68     for (int i = 1 ; i <= tot ; i++) adde(fail[i],i);
 69     dfs(0);
 70     cnt = 0;
 71     build(rt,1,tot);
 72 }
 73 inline void update(int x){
 74     sgt[x].mx = max(sgt[sgt[x].ls].mx,sgt[sgt[x].rs].mx);
 75 }
 76 inline void add(int x,ll d){
 77     sgt[x].tag = max(sgt[x].tag,d);
 78     sgt[x].mx = max(sgt[x].mx,d);
 79 }
 80 inline void pushdown(int x){
 81     if ( sgt[x].tag != 0 ){
 82         add(sgt[x].ls,sgt[x].tag);
 83         add(sgt[x].rs,sgt[x].tag);
 84         sgt[x].tag = 0;
 85     }
 86 }
 87 void modify(int x,int l,int r,int ls,int rs,ll d){
 88     if ( ls <= l && rs >= r ){
 89         add(x,d);
 90         return;
 91     }
 92     pushdown(x);
 93     int mid = (l + r) >> 1;
 94     if ( ls <= mid ) modify(sgt[x].ls,l,mid,ls,rs,d);
 95     if ( rs > mid ) modify(sgt[x].rs,mid + 1,r,ls,rs,d);
 96     update(x);
 97 }
 98 ll query(int x,int l,int r,int id){
 99     if ( l == r ) return sgt[x].mx;
100     pushdown(x);
101     int mid = (l + r) >> 1;
102     if ( id <= mid ) return query(sgt[x].ls,l,mid,id);
103     return query(sgt[x].rs,mid + 1,r,id);
104 }
105 void Dodp(){
106     for (int i = 1 ; i <= n ; i++){
107         int p = rec[i];
108         while ( p ){
109             f[i] = max(f[i],query(rt,1,tot,l[p]));
110             p = fa[p];
111         }
112         f[i] += w[i];
113         f[i] = max(0ll,f[i]);
114         modify(rt,1,tot,l[rec[i]],r[rec[i]],f[i]);
115     }
116     for (int i = 1 ; i <= n ; i++) ans = max(ans,f[i]);
117 }
118 int main(){
119     freopen("input.txt","r",stdin);
120     scanf("%d",&T);
121     while ( T-- ){
122         clear();
123         scanf("%d",&n);
124         for (int i = 1 ; i <= n ; i++){
125             scanf("%s",ch) , scanf("%d",&w[i]);
126             int l = strlen(ch);
127             cur = 0;
128             for (int j = 0 ; j < l ; j++){
129                 insert(ch[j] - 'a');
130             }
131             rec[i] = cur;
132         }
133         build_AC();
134         Dodp();
135         printf("%lld\n",ans);
136     }
137     return 0;
138 }

 

转载于:https://www.cnblogs.com/zqq123/p/5505824.html

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

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

相关文章

php的gd库处理大的图片,PHP的gd库处理图片

gd库为图片加文字水印和图片输出$number $result[certno];//设置水印内容$file ./Uploads/certs/ . $number . .jpg;if(!is_file($file)){$src ./template/public/img/zhengshu.jpg;//定义图片地址$info getimagesize($src);//获取图片信息$type image_type_to_extension(…

dedecms模版php,dedecms专题模板怎么用

dedecms专题模板怎么用&#xff1f;DeDeCms的专题相关信息bbs上相对较少&#xff0c;之前查阅了很多资料都未找到其解决方案推荐学习&#xff1a;织梦cms无柰只有靠自己动手丰衣足食&#xff1b;在官方的版本上有这样的一段话&#xff1a;1、文章列表用ID1,ID2,ID3这样形式分开…

Windows中断那些事儿

搞内核研究的经常对中断这个概念肯定不陌生&#xff0c;经常我们会接触很多与中断相关的术语&#xff0c;按照软件和硬件进行分类&#xff1a; 硬件CPU相关&#xff1a; IRQ、IDT、cli&sti 软件操作系统相关&#xff1a; APC、DPC、IRQL 一直以来对中断这一部分内容弄的一知…

php值对象模式场景,php设计模式介绍之值对象模式第1/5页

例如&#xff1a;通常用一个对象描述一个日期、一个数字或者货币。日期、整数或美元的类定义是都是便于使用的、快捷、便于封装的&#xff0c;并且方便进行拷贝&#xff0c;相互比较&#xff0c;甚至是创建。 从表面上看&#xff0c;这些描述简单的对象很容易被执行&#xff1a…

5月17日 AJAX 之 XML

主页面&#xff1a; <head> <script src"../jquery-2.2.3.min.js"></script> </head><body> <select id"sel"></select> </body> <script type"text/javascript"> $(document).ready(fun…

oracle 修改字段长度 用时,Oracle修改字段长度以及计算天数

sql修改字段长度的语法&#xff1a;alter table 表名 modify 字段名 字段类型;sql修改字段长度的示例代码alter table qtline modify qtl_bidernote VARCHAR2(4000);标准SQL&#xff0c;对任何数据库都适用alter table fzrtmis.reporttemplate modify REPNAME varchar(100)&…

(1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说&#xff0c;小的MVC项目是不考虑领域的&#xff0c;但是&#xff0c;如果是稍微复杂一点的项目&#xff0c;往往是需要领域这个概念的。 一个领域就是一个小型的MVC项目&#xff0c;所以领域…

oracle数据库存储结构语句,oracle基本语句(第五章、数据库逻辑存储结构管理)...

1、使用SYS用户以SYSDBA身份登录到SQL Plus&#xff0c;使用视图V$TABLESPACE查看表空间信息SELECT * FROM V$TABLESPACE;2、查看视图DBA_TABLESPACES查看所有表空间的属性和在线状态SELECT TABLESPACE_NAME, CONTENTS, STATUSFROMDBA_TABLESPACES;--表空间名&#xff0c;表空间…

重启模块与及关开邮件存储设置功能页面-PHP-shell-py

邮件系统几百台&#xff0c;每台负责 grep -P "^ip\d.\d." /home/mymail/newconf/hosts.conf -c465 每台机器负责启动的模块又是不一样的如&#xff1a; A机器&#xff1a; ProgramsList"1svr,2svr,3svr,4svr," b机器&#xff1a; ProgramsList"asvr,…

oracle 表达式1000,oracle环境下占用编号的方法报语法错误:ORA-01795: 列表中的最大表达式数为 1000...

oracle 环境下&#xff0c;调用方法NumberCodeGenerateManager.OcuppyModelNumberCodesAfterSaved(ObjectID, modelID, ds)进行编号占用。当DataSet的数据行数〉1000时&#xff0c;会报语法错误&#xff1a;ORA-01795: 列表中的最大表达式数为 1000。跟踪语句如下&#xff1a;u…

奋斗路上的励志

当初看蜘蛛侠印象最深的一句台词就是“你是怎么样的人取决于你选择做什么样的人”。 昨天的你&#xff0c;你不可能完全忘记&#xff0c;但是你知道你曾经有多可耻卑微&#xff0c;重要的是你要做什么样的人&#xff0c;明天你会是什么样的你&#xff0c;重在做好现在的你。 坚…

用IIS配置反向代理

https://natapp.cn/ http://blog.csdn.net/g2321514568/article/details/12406755 目标服务器&#xff1a;targetServer 配置反向代理的服务器&#xff1a;reveseProxServer 1、确定最终访问的网址&#xff1a;比如www.baidu.com 、www.csdn.net等等。 当然你也可以自己在targ…

oracle存储过程使用ftp,ASM存储FTP上传文件

引用SQL>execute dbms_xdb.sethttpport(8080);SQL>execute dbms_xdb.setftpport(2100);SQL>commit;检查端口是否开启引用SQL> select dbms_xdb.GETHTTPPORT() from dual;DBMS_XDB.GETHTTPPORT()----------------------8080SQL> select dbms_xdb.GETFTPPORT() fr…

Python学习笔记——基础篇【第六周】——hashlib模块

常用模块之hashlib模块  用于加密相关的操作&#xff0c;3.x里代替了md5模块和sha模块&#xff0c;主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 &#xff0c;MD5 算法 import md5 hash md5.new() hash.update(admin) print hash.hexdigest() MD5-废弃import shahash sha…

oracle数据库领域,菜鸟成长课程之《Oracle数据库职业直通车》,引领大家真正进入Oracle数据库领域...

课程简介&#xff1a;近年来&#xff0c;Oracle数据库无疑是全球数据库领域中的领航者&#xff0c; Oracle DBA的待遇节节攀升&#xff0c; 导致了许多人希望转入这个行业。而Oracle数据库又因它的庞大和复杂另很多人望而却步&#xff0c;找不到入门的捷径。本课程是专门为在校…

虚拟存储

为解决日益增长的内存需要&#xff0c;有以下几种解决办法&#xff1a; 1.覆盖&#xff1a; 将程序划分成几个模块&#xff0c;将没有调用关系的模块&#xff08;即不会同时运行的模块&#xff09;分成一组&#xff0c;其中每组所占的内存大小为组内所需内存最大的模块的内存&a…

oracle 12542,TNS-12542: TNS:address already in use

研发说无法访问数据库&#xff0c;数据库正常运行&#xff0c;那就可能是监听有问题&#xff0c;一波简单操作搞定。[oracleentegor-1 ~]$ lsnrctl startLSNRCTL for Linux: Version 11.2.0.4.0 - Production on 17-AUG-2018 09:04:01Copyright (c) 1991, 2013, Oracle. All ri…

作为前端应当了解的Web缓存知识

缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备。对于前端开发者来说&#xff0c;浏览器充当了重要角色。除此外常见的还有各种各样的代理服务器也可以做缓存。当Web请求到达缓存时&#xff0c;缓存从本地副本中提取这个副本内容而不需要经过服务器。…

怎么恢复oracle的包,【学习笔记】使用dbms_backup_restore包恢复数据库

天萃荷净使用dbms_backup_restore包恢复数据库Oracle提供了一个包:DBMS_BACKUP_RESTORE包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调…

No module named 'urllib2'

import urllib2 response urllib2.urlopen(http://www.baidu.com/) html response.read() print html 报错 import urllib2ImportError: No module named urllib2 import urllib.request respurllib.request.urlopen(http://www.baidu.com) htmlresp.read() print(h…