Recently George is preparing for the Graduate Record Examinations (GRE for short). Obviously the most important thing is reciting the words.

Now George is working on a word list containing \(N\) words.

He has so poor a memory that it is too hard for him to remember all of the words on the list. But he does find a way to help him to remember. He finds that if a sequence of words has a property that for all pairs of neighboring words, the previous one is a substring of the next one, then the sequence of words is easy to remember.

So he decides to eliminate some words from the word list first to make the list easier for him. Meantime, he doesn't want to miss the important words. He gives each word an importance, which is represented by an integer ranging from \(-1000\) to \(1000\), then he wants to know which words to eliminate to maximize the sum of the importance of remaining words. Negative importance just means that George thought it useless and is a waste of time to recite the word.

Note that although he can eliminate any number of words from the word list, he can never change the order between words. In another word, the order of words appeared on the word list is consistent with the order in the input. In addition, a word may have different meanings, so it can appear on the list more than once, and it may have different importance in each occurrence.

空间限制:32MB

时间限制:15s

考虑倒着来,建出 AC 自动机,考虑倒着来,修改后变成一个询问子树最大值,用线段树维护就可以了。

但是空间32MB?

26<32,把一个字符拆成 5 个01,比如把 'a' 拆成 00000,'b' 拆成 00001,然后空间就变成了 \(5\times 2\times N\)

当然也可以三个 \(3\times 10^5\) 压成 1 个 long long。

线段树也是可以压的,注意到关键点只有 \(2\times 10^4\) 个,所以可以找到离一个点最近的关键点祖先。

能共用的数组就共用,dfs写手写栈。

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5,M=2e4+5;
bool x;
int n,t,m,p[M],e_num,tme,q[N],idx,fil[N],l,r,ans,hd[N],ln[M],fr[N],id[M],w[M],sz[N];
bool tg[N];
long long tr[N][9];
char str[N];
struct edge{
int v,nxt;
}e[N];
bool y;
int qry(int u,int c)
{
if(c%3==0)
return tr[u][c/3]&1048575;
if(c%3==1)
return (tr[u][c/3]>>20)&1048575;
return tr[u][c/3]>>40;
}
void gai(int u,int c,int t)
{
if(c%3==0)
tr[u][c/3]=tr[u][c/3]&1152921504605798400LL|t;
if(c%3==1)
tr[u][c/3]=tr[u][c/3]&1152920405096267775LL|((1LL*t)<<20);
if(c%3==2)
tr[u][c/3]=tr[u][c/3]&1099511627775LL|((1LL*t)<<40LL);
}
void add_edge(int u,int v)
{
e[++e_num]=(edge){v,hd[u]};
hd[u]=e_num;
}
int insert(char s[])
{
int u=0;
for(int i=0,k;s[i];i++)
{
if(!(k=qry(u,s[i]-'a')))
{
gai(u,s[i]-'a',k=++idx);
memset(tr[idx],0,sizeof(tr[idx]));
}
u=k;
}
return u;
}
int cmp(int x,int y)
{
return ln[x]-ln[x-1]>ln[y]-ln[y-1];
}
void upd(int o,int l,int r,int x,int y)
{
if(l==r)
return hd[o]=max(hd[o],y),void();
int md=l+r>>1;
if(md>=x)
upd(o<<1,l,md,x,y);
else
upd(o<<1|1,md+1,r,x,y);
hd[o]=max(hd[o<<1],hd[o<<1|1]);
}
int ask(int o,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
return hd[o];
int md=l+r>>1,ans=0;
if(md>=x)
ans=max(ans,ask(o<<1,l,md,x,y));
if(md<y)
ans=max(ans,ask(o<<1|1,md+1,r,x,y));
return ans;
}
void build()
{
memset(fil,0,sizeof(fil));
l=1,r=0;
for(int i=0,k;i<26;i++)
if(k=qry(0,i))
q[++r]=k;
while(l<=r)
{
for(int i=0,k;i<26;i++)
{
if(k=qry(q[l],i))
fil[q[++r]=k]=qry(fil[q[l]],i);
else
gai(q[l],i,qry(fil[q[l]],i));
}
++l;
}
for(int i=1;i<=idx;i++)
add_edge(fil[i],i);
memset(tg,0,sizeof(tg));
memset(sz,0,sizeof(sz));
for(int i=1;i<=n;i++)
tg[p[i]]=sz[p[i]]=1;
for(int i=1;i<=r;i++)
{
if(sz[q[i]])
fr[q[i]]=q[i];
else
fr[q[i]]=fr[fil[q[i]]];
}
for(int i=r;i;--i)
sz[fil[q[i]]]+=sz[q[i]];
q[l=r=1]=0;
while(r)
{
int x=q[r];
--r;
if(tg[x])
fil[x]=++tme;
for(int i=hd[x];i;i=e[i].nxt)
q[++r]=e[i].v;
}
}
int main()
{
//printf("%d\n",(&y-&x)>>20);
scanf("%d",&t);
for(int T=1;T<=t;T++)
{
memset(tr[0],0,sizeof(tr[0]));
memset(hd,tme=idx=e_num=0,sizeof(hd));
ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s%d",str+ln[i-1],w+i);
p[i]=insert(str+ln[i-1]);
ln[i]=ln[i-1]+strlen(str+ln[i-1]);
}
build();
memset(hd,0,sizeof(hd));
for(int i=n,dp;i;i--)
{
int u=0;
ans=max(ans,dp=w[i]+max(0,ask(1,1,tme,fil[p[i]],fil[p[i]]+sz[p[i]]-1)));
for(int j=ln[i-1];j<ln[i];j++)
{
u=qry(u,str[j]-'a');
if(fil[fr[u]])
upd(1,1,tme,fil[fr[u]],dp);
}
}
printf("Case #%d: %d\n",T,ans);
}
}

[HDU4117] GRE的更多相关文章

  1. HDU4117 GRE WORDS(AC自动机+线段树维护fail树的dfs序)

    Recently George is preparing for the Graduate Record Examinations (GRE for short). Obviously the mos ...

  2. 【Network】OVS VXLAN/GRE 实践

    参考资料: OVS/VXLAN/GRE参考 ovs vxlan IP overray_百度搜索 OVS操作总结-Neutron-about云开发 OpenStack OVS GRE/VXLAN网络_z ...

  3. 【Network】OVS、VXLAN/GRE、OVN等 实现 Docker/Kubernetes 网络的多租户隔离

    多租户隔离 DragonFlow与OVN | SDNLAB | 专注网络创新技术 Neutron社区每周记(6.25~7.6)| OVS将加入Linux基金会?OVN或抛弃ovsdb? | Unite ...

  4. Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  5. GRE与Vxlan网络详解

    1. GRE 1.1 概念 GRE全称是Generic Routing Encapsulation,是一种协议封装的格式,具体格式内容见:https://tools.ietf.org/html/rfc ...

  6. 探索 OpenStack 之(8):Neutron 深入探索之 OVS + GRE 之 完整网络流程 篇

    前两篇博文分别研究了Compute节点和Neutron节点内部的网络架构.本文通过一些典型流程案例来分析具体网络流程过程. 0. 环境 同 学习OpenStack之(7):Neutron 深入学习之 ...

  7. openstack网络(neutron)模式之GRE的基本原理

    neutron网络目的是为OpenStack云更灵活的划分网络,在多租户的环境下提供给每个租户独立的网络环境. neutron混合实施了第二层的VLAN和第三层的路由服务,它可为支持的网络提供防火墙, ...

  8. 探索 OpenStack 之(7):Neutron 深入探索之 Open vSwitch (OVS) + GRE 之 Neutron节点篇

    0. 测试环境 硬件环境:还是使用四节点OpenStack部署环境,参见 http://www.cnblogs.com/sammyliu/p/4190843.html OpenStack配置: ten ...

  9. 学习OpenStack之(6):Neutron 深入学习之 OVS + GRE 之 Compute node 篇

    0.环境 硬件环境见上一篇博客:学习OpenStack之(5):在Mac上部署Juno版本OpenStack 四节点环境 OpenStack网络配置:一个tenant, 2个虚机 Type drive ...

  10. gre网络细节

    一.OpenStack网络设备的命名规律: 1.TenantA的router和Linux网络命名空间qrouter名称 root@controller:~# neutron --os-tenant-n ...

随机推荐

  1. 千万级数据深分页查询SQL性能优化实践

    一.系统介绍和问题描述 如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系:并对外提供各种关系查询,比如查询用户的关注商品或店铺列表, ...

  2. 使用GPU搭建支持玛雅(Maya)和Adobe AI,DW,PS的职校云计算机房

    背景 学校为职业学校,计算机教室需要进行Maya.Adobe Illustrator.Adobe Dreamweaver.Adobe PhotoShop等软件的教学.每个教室为35用户.资源需求为4核 ...

  3. Vue 中的 Ajax

    1.1 使用代理服务器 1.1.1 方式一 在 vue.config.js 中添加如下配置: devServer:{ proxy:"http://localhost:5000" } ...

  4. oracle监听配置与防火墙问题

    在建好pdb容器后,需配置网络,才能从客户端连接服务器端 1.首先查看pdb容器的服务名 lsnrctl status ... Service "19cdb" has 1 inst ...

  5. 【Qt6】列表模型——树形列表

    QStandardItemModel 类作为标准模型,主打"类型通用",前一篇水文中,老周还没提到树形结构的列表,本篇咱们就好好探讨一下这货. 还是老办法,咱们先做示例,然后再聊知 ...

  6. Linux——Linux必备的基础知识总结

    文章目录 一.Linux操作系统概述 1.发展 2.组成 3.Linux的特性: 二.Linux操作系统安装 1.Linux的选择 2.安装Ubuntu Desktop 3.基本操作 三.Linux文 ...

  7. ElasticSearch系列——文档操作

    文章目录 Elasticsearch的增删查改(CURD) 一 CURD之Create 二 CURD之Update 三 CURD之Delete 四 CURD之Retrieve Elasticsearc ...

  8. 【ZT】关于字符集

    utf8 全包容了gbk ,并不是说超集和子集:8i 的数据库 的 utf8 是  4位定长的字符编码:9i 和以上数据库的utf8   有4位定长AL32UTF8和  不定长的  UTF8  ,都是 ...

  9. 区间检测(range)

    区间检测(range) 时间限制: 1 Sec  内存限制: 128 MB 题目描述 给定一个长度为n的序列,进行m次检测,每次检测某个区间中,是否有重复的数. 输入 第一行,两个整数n和m,表示序列 ...

  10. Python 环境迁移

    平时用python环境会装一堆依赖,也包括自己的模块,要迁移到陌生环境,得好好处理才行. 下面介绍个方法,实践过还可以: 总结下步骤: miniconda或conda安装一个python环境,pyth ...