第九周 10.25-10.31

10.25

HDU 4117 GRE Words

卡了很久的一个题目。比较综合。

看了很久题解还是各种写挫。

毕竟除了模拟题都没敲过那么长的。

 

题意:按顺序给N个单词,每个单词有权值,删去其中任意单词,使得前面的单词为后面单词的子串,求最大权值和。

做法:先建好AC自动机。

 

   最先想到的方法应该是这样的。

   定义dp[i]为以第i个串为最后一个串的答案。

   转移是dp[i]=max{W[i],dp[j]+W[i]}(j为i子串)

   那么只要再拿这N个单词在AC自动机上匹配一遍。

   每过一个节点相当于经过这个串的一个前缀。而这个节点的fail指向的是这个前缀的后缀。

   于是经过的每个节点时都通过fail一直走到root就遍历了这个串的所有子串。

   那么我们不妨定义f[u]为节点u所对应的单词的所有后缀的答案。

   那么可以用这种方法借助f[]来求出dp。

   

   然而这样是T的。

   于是考虑一种用线段树优化的方法。

   

   考虑到我们每次是顺着fail指针更新答案的。而且每次更新一个节点后只会影响fail指向它的节点。

   按照fail反向建树。这样每个父节点都是孩子节点的前缀。也就是每次更新一个节点后只影响它的子树。

   先在fail树上dfs一遍打好时间戳。

   线段树的每个节点维护时间戳所对应的fail树上节点的f[]值。

   于是按照段更新的区间最值线段树写就可以了。

   每次询问所有前缀的f[]。再更新末节点对应子树的f[]。

   所有取最大即为答案。

   

   最后防爆栈黑科技交C++。   

 

  1 #pragma comment(linker, "/STACK:102400000,102400000")
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <queue>
  7 using namespace std;
  8 const int maxnode=3e5+10,sigma_size=26;
  9 const int maxn=2e4+10;
 10 int n,p[maxn],W[maxn];
 11 char s[maxnode];
 12 
 13 //fail_tree
 14 int cnt,headlist[maxnode];
 15 int timer,dfn[maxnode][2];
 16 struct e
 17 {
 18     int to,pre;
 19 } edge[2*maxnode];
 20 
 21 void add(int from,int to)
 22 {
 23     cnt++;
 24     edge[cnt].pre=headlist[from];
 25     edge[cnt].to=to;
 26     headlist[from]=cnt;
 27 }
 28 
 29 void dfs(int pos,int fa)
 30 {
 31     dfn[pos][0]=++timer;
 32     for(int i=headlist[pos];i;i=edge[i].pre)
 33     {
 34         int to=edge[i].to;
 35         if(to==fa) continue;
 36         dfs(to,pos);
 37     }
 38     dfn[pos][1]=++timer;
 39 }
 40 
 41 //seg_tree
 42 struct seg_tree
 43 {
 44     int l,r,val;
 45 }tree[maxnode<<3];
 46 
 47 void buildtree(int pos,int l,int r)
 48 {
 49     tree[pos].l=l;
 50     tree[pos].r=r;
 51     tree[pos].val=0;
 52     if(l<r)
 53     {
 54         buildtree(pos*2,l,(l+r)/2);
 55         buildtree(pos*2+1,(l+r)/2+1,r);
 56     }
 57 }
 58 
 59 void pushdown(int pos)
 60 {
 61     tree[2*pos].val=max(tree[2*pos].val,tree[pos].val);
 62     tree[2*pos+1].val=max(tree[2*pos+1].val,tree[pos].val);
 63 }
 64 
 65 void update(int pos,int l,int r,int val)
 66 {
 67     if(tree[pos].l>=l&&tree[pos].r<=r) tree[pos].val=max(tree[pos].val,val);
 68     else
 69     {
 70         pushdown(pos);
 71         if((tree[pos].l+tree[pos].r)/2>=r) update(pos*2,l,r,val);
 72         else if((tree[pos].l+tree[pos].r)/2<l) update(pos*2+1,l,r,val);
 73         else
 74         {
 75             update(pos*2,l,r,val);
 76             update(pos*2+1,l,r,val);
 77         }
 78     }
 79 }
 80 
 81 int query(int pos,int l,int r)
 82 {
 83     if(tree[pos].l>=l&&tree[pos].r<=r) return tree[pos].val;
 84     int ret=0;
 85     pushdown(pos);
 86     if((tree[pos].l+tree[pos].r)/2>=r) ret=max(ret,query(pos*2,l,r));
 87     else if((tree[pos].l+tree[pos].r)/2<l) ret=max(ret,query(pos*2+1,l,r));
 88     else
 89     {
 90         ret=max(ret,query(pos*2,l,r));
 91         ret=max(ret,query(pos*2+1,l,r));
 92     }
 93     return ret;
 94 }
 95 
 96 struct Ac_auto
 97 {
 98     int Next[maxnode][sigma_size];
 99     int fail[maxnode];
100     int sz;
101     Ac_auto(){sz=1;memset(Next[0],0,sizeof(Next[0]));}
102     void init(){sz=1;memset(Next[0],0,sizeof(Next[0]));}
103     int idx(char c) {return c-'a';}
104 
105     void insert(char *s)
106     {
107         int u=0,n=strlen(s);
108         for(int i=0;i<n;i++)
109         {
110             int c=idx(s[i]);
111             if(!Next[u][c])
112             {
113                 memset(Next[sz],0,sizeof(Next[sz]));
114                 Next[u][c]=sz++;
115             }
116             u=Next[u][c];
117         }
118     }
119 
120     void build()
121     {
122         queue<int> q;
123         fail[0]=0;
124         for(int i=0;i<sigma_size;i++) if(Next[0][i])
125         {
126             fail[Next[0][i]]=0;
127             q.push(Next[0][i]);
128         }
129         while(!q.empty())
130         {
131             int pos=q.front(); q.pop();
132             for(int i=0;i<sigma_size;i++)
133             {
134                 if(!Next[pos][i]) Next[pos][i]=Next[fail[pos]][i];
135                 else
136                 {
137                     fail[Next[pos][i]]=Next[fail[pos]][i];
138                     q.push(Next[pos][i]);
139                 }
140             }
141         }
142     }
143 
144     void fail_tree()
145     {
146         cnt=0;
147         memset(headlist,0,sizeof(headlist));
148         for(int i=1;i<sz;i++)
149         {
150             add(i,fail[i]);
151             add(fail[i],i);
152         }
153     }
154 
155     int solve()
156     {
157         int ret=0;
158         for(int i=1;i<=n;i++)
159         {
160             int u=0,tmp=0;
161             for(int j=p[i-1];j<p[i];j++)
162             {
163                 u=Next[u][idx(s[j])];
164                 tmp=max(tmp,query(1,dfn[u][0],dfn[u][0])+W[i]);
165             }
166             ret=max(ret,tmp);
167             update(1,dfn[u][0],dfn[u][1],tmp);
168         }
169         return ret;
170     }
171 
172 }ACA;
173 
174 
175 int main(void)
176 {
177     int T; scanf("%d",&T);
178     for(int kase=1;kase<=T;kase++)
179     {
180         scanf("%d",&n);
181         ACA.init();
182         for(int i=1;i<=n;i++)
183         {
184             scanf("%s%d",s+p[i-1],W+i);
185             ACA.insert(s+p[i-1]);
186             p[i]=p[i-1]+strlen(s+p[i-1]);
187         }
188         ACA.build();
189         ACA.fail_tree();
190         timer=0;
191         dfs(0,-1);
192         buildtree(1,1,timer);
193         printf("Case #%d: %d\n",kase,ACA.solve());
194     }
195     return 0;
196 }
Aguin

 

10.26-10.31

什么都没干。

转载于:https://www.cnblogs.com/Aguin/p/4908313.html

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

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

相关文章

芯片设计中的latch_Latch-up (闩锁效应)

------------------------------------WeChat subscription account&#xff1a;Analog CMOS------------------------------------每周分享Analog IC学习资料/笔记。关注获取。。。。。00 - 本文内容CMOS 中的闩锁效应&#xff08;latch-up&#xff09;的来源具体的避免 latch…

pythonopencv算法_python opencv之SURF算法示例

本文介绍了python opencv之SURF算法示例&#xff0c;分享给大家&#xff0c;具体如下&#xff1a; 目标&#xff1a; SURF算法基础 opencv总SURF算法的使用 原理&#xff1a; 上节课使用了SIFT算法&#xff0c;当时这种算法效率不高&#xff0c;需要更快速的算法。在06年有人提…

c++判断ftp服务器文件存在性判断_BitTorrent协议与传统文件分发协议对比

一、文件传输前端时间做了和文件传输相关的工作&#xff0c;今天抽空做个总结。总结一下平常使用的几种协议以及BtTorrent协议。其实BitTorrent协议也不是什么新协议&#xff0c;它诞生也十几年了。咱也蹭个热点&#xff0c;最近几年大火的区块链技术也和BitTorrent协议有着异曲…

java基础全套

这是我自己早前听课时整理的java基础全套知识 使用于初学者 也可以适用于中级的程序员 我做成了chm文档的类型 你们可以下载 笔记是比较系统全面&#xff0c;可以抵得上市场上90%的学习资料。讨厌那些随便乱写的资料还有拿出来卖钱的人&#xff01;在这里我免费的分享出来供…

顺丰快递单号的规律_顺丰速运顺丰快递单号查询大全

如何一键查询快递单号顺丰快递单号查询跟踪&#xff0c;鸡蛋是我们日常生活当中最为常见的一种食材啦&#xff0c;相信在每一个家庭当中每天都会吃到鸡蛋&#xff0c;因为鸡蛋的营养价值非常高&#xff0c;它含有丰富的蛋白质&#xff0c;可以为我们身体提供能量&#xff0c;别…

用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小.ppt...

用计算器求算数平方根、用有理数估计算数平方根的大小.ppt 上传人&#xff1a;jw****88文档编号&#xff1a;85573818上传时间&#xff1a;2020-06-11格式&#xff1a;PPT页数&#xff1a;20大小&#xff1a;2.14MB下载提示(请认真阅读)1.请仔细阅读文档&#xff0c;确保文档完…

【整理】强化学习与MDP

【入门&#xff0c;来自wiki】 强化学习是机器学习中的一个领域&#xff0c;强调如何基于环境而行动&#xff0c;以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论&#xff0c;即有机体如何在环境给予的奖励或惩罚的刺激下&#xff0c;逐步形成对刺激的预期&#x…

nginx 根证书 服务器证书,Nginx双向证书校验(服务器验证客户端证书)

1、创建Root CA私钥openssl genrsa -out root-ca.key 10242、创建Root CA证书请求openssl req -new -out root-ca.csr -key root-ca.key3、签发Root CA根证书openssl x509 -req -in root-ca.csr -out root-ca.crt -signkey root-ca.key -CAcreateserial -days 36505、生成服务器…

移动app测试的多样性_做移动APP功能测试,这些因素你得都考虑到~

对于刚入行的测试新手来说&#xff0c;无论是做手动测试还是自动化测试&#xff0c;前期都避免不了学习前人经验&#xff0c;从而尽可能减少自己的漏测问题。作为一个过来人&#xff0c;今天&#xff0c;我就将自己的移动APP功能测试分享给大家&#xff0c;希望对新手有一定帮助…

pytorch dropout_PyTorch初探MNIST数据集

前言&#xff1a;本文主要描述了如何使用现在热度和关注度比较高的Pytorch(深度学习框架)构建一个简单的卷积神经网络&#xff0c;并对MNIST数据集进行了训练和测试。MNIST数据集是一个28*28的手写数字图片集合&#xff0c;使用测试集来验证训练出的模型对手写数字的识别准确率…

saphana服务器硬件评估,华为SAP HANA一体机:你身边的数据计算专家

​ 华为服务器高级营销经理 谭鑫/文​在当今数字经济时代&#xff0c;如何将数据快速变现为价值资产是很多企业追求的目标。借助SAPHANA平台方案与技术&#xff0c;可以将数据处理化繁为简&#xff0c;及时汲取价值信息&#xff0c;为企业的业务决策提供数据参考&#xff0c;从…

verilog设置24进制计数器_阅读笔记:《Verilog HDL入门》第3章 Verilog语言要素

3.1标识符1.Verilog中的Identifier是由任意字母、数字、下划线和$符号组成的&#xff0c;第一个字符必须是字母或者下划线。区分大小写。2.Escaped Identifier是为了解决简单标识符不能以数字和$符号开头的缺点。如下所示&#xff1a;3.关键字。我的理解是保留字包括关键字&…

锋利的jQuery--jQuery与DOM对象的互相转换,DOM的三种操作(读书笔记一)

1.jQuery对象就是通过jQuery包装DOM对象后产生的对象。2.jQuery对象和DOM对象的相互转换。良好的书写风格&#xff1a;var $input$("input")jQuery获取的对象在变量前面加上$。<1>jQUery对象转成DOM对象,两种方法&#xff1a;[index]和get(index)a:var $cr$(&q…

网站显示不正常服务器怎么弄,你真的知道网站出现收录不正常的原因是什么吗...

当一个新网站构建起来时&#xff0c;每天所担心的就是一个收录量。当你偶然看到收录减少时&#xff0c;不免心有所寒。不知道怎么“得罪”蜘蛛大哥了&#xff0c;发生了什么事把收录量给“没收”了。作为SEOer&#xff0c;我们知道在搜索引擎蜘蛛的心里内容的质量占有很大比重&…

ajax status php,解决laravel 出现ajax请求419(unknown status)的问题

如下所示&#xff1a;这个是因为laravel自带csrf验证的问题解决方法方法一&#xff1a;去关掉laravel的csrf验证&#xff0c;但这个人不建议&#xff0c;方法也不写出来了。方法二&#xff1a;把该接口写到api.php上就好了方法三&#xff1a;首先在页面加上然后请求的在header里…

string 转比较运算符_运算符

1、概述算术运算符 - * /基本运算算术运算符%取模&#xff0c;取余数&#xff0c;计算整除算术运算符 --自增 自减比较运算符 !相等比较 不等比较逻辑运算符&& &逻辑与 短路与&#xff08;同真为真&#xff09;逻辑运算符|| |逻辑或 短路或&#xff08;一真则真&am…

神舟战神换cpu教程_神舟将十代i5称为“神U出世”?聊聊到底有哪些优势

在各个品牌大力的宣传之下&#xff0c;消费者对于笔记本电脑乃至各种数码硬件的要求都越来越高。既要好的处理器、显卡等性能配置&#xff0c;又要好的屏幕&#xff0c;甚至还得低定价&#xff0c;这就产生一种鱼与熊掌不可兼得的感觉了。就在今年的表白日&#xff0c;神舟电脑…

服务器系统杀毒系统崩溃怎么恢复,系统崩溃是什么原因导致的

大家在使用电脑的时候&#xff0c;经常都是需要安装一些软件和其他东西的。但是在安装软件的时候&#xff0c;很容易让一些病毒侵入电脑。一旦病毒侵入了电脑&#xff0c;就很容易让电脑系统崩溃。那么系统崩溃是什么原因导致的呢&#xff1f;下面就来告诉大家系统崩溃的原因及…

atom配置python环境_python与excel有段情之二:python的安装和环境配置

索引python与excel有段情之一&#xff1a;前述python与excel有段情之二&#xff1a;python的安装和环境配置python与excel有段情之三&#xff1a;python编程前的准备工作和基本概念python与excel有段情之四&#xff1a;案例1.把多excel表抽数生成新excel表python与excel有段情之…

x86服务器当虚拟化的存储,龙存科技-软件定义数据中心产品提供商

一、应用背景服务器虚拟化技术是云计算的核心技术&#xff0c;是将系统进行虚拟化应用于服务器之上的技术。面向应用集中化处理&#xff0c;能最大的程度上利用硬件资源&#xff0c;并且实现灵活分配。虚拟化技术是将计算机底层的硬件功能的模拟&#xff0c;需要复杂的语句和机…