BZOJ2905 : 背单词
首先对所有单词建立AC自动机,$S$是$T$的子串等价于$T$的某个前缀通过$fail$链可以走到$S$的终止节点,即$S$的终止节点是$T$某个前缀在$fail$树上的祖先。
设$f[i]$表示考虑了前$i$个单词,且第$i$个单词必选时子序列价值的最大值,
则$f[i]=\max(单词i每个前缀的贡献)+w[i]$,计算出$f[i]$后再在单词$i$终止节点在$fail$树的子树里打上$f[i]$的标记,线段树维护即可。
时间复杂度$O(L\log L)$。
#include<cstdio>
#include<cstring>
const int N=20010,M=300010;
typedef long long ll;
char s[M];
int tot,son[M][26],fail[M],q[M],G[M],NXT[M],st[M],en[M],dfn;
int Case,n,i,j,w[N],g[N],v[M],nxt[M],ed;
ll tag[1050000],dp,ans;
inline void ins(int p){
for(int l=strlen(s),x=0,i=0,w;i<l;i++){
if(!son[x][w=s[i]-'a'])son[x][w]=++tot;
v[++ed]=x=son[x][w];nxt[ed]=g[p];g[p]=ed;
}
}
void make(){
int h=1,t=0,i,j,x;fail[0]=-1;
for(i=0;i<26;i++)if(son[0][i])q[++t]=son[0][i];
while(h<=t)for(x=q[h++],i=0;i<26;i++)
if(son[x][i])fail[son[x][i]]=son[fail[x]][i],q[++t]=son[x][i];
else son[x][i]=son[fail[x]][i];
}
void dfs(int x){
st[x]=++dfn;
for(int i=G[x];i;i=NXT[i])dfs(i);
en[x]=dfn;
}
void build(int x,int a,int b){
tag[x]=0;
if(a==b)return;
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
}
inline void up(ll&a,ll b){if(a<b)a=b;}
void change(int x,int a,int b,int c,int d){
if(c<=a&&b<=d){up(tag[x],dp);return;}
int mid=(a+b)>>1;
if(c<=mid)change(x<<1,a,mid,c,d);
if(d>mid)change(x<<1|1,mid+1,b,c,d);
}
void ask(int x,int a,int b,int c){
up(dp,tag[x]);
if(a==b)return;
int mid=(a+b)>>1;
if(c<=mid)ask(x<<1,a,mid,c);else ask(x<<1|1,mid+1,b,c);
}
int main(){
scanf("%d",&Case);
while(Case--){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%s%d",s,&w[i]),ins(i);
make();
for(i=1;i<=tot;i++)NXT[i]=G[fail[i]],G[fail[i]]=i;
dfs(0);
build(1,1,dfn);
for(ans=0,i=1;i<=n;i++){
for(dp=0,j=g[i];j;j=nxt[j])ask(1,1,dfn,st[v[j]]);
up(ans,dp+=w[i]);
change(1,1,dfn,st[v[g[i]]],en[v[g[i]]]);
}
printf("%lld\n",ans);
for(i=dfn=0;i<=tot;i++)for(fail[i]=G[i]=j=0;j<26;j++)son[i][j]=0;
for(ed=tot=0,i=1;i<=n;i++)g[i]=0;
}
return 0;
}
BZOJ2905 : 背单词的更多相关文章
- BZOJ2905: 背单词 AC自动机+fail树+线段树
$zjq$神犇一眼看出$AC$自动机 $Orz$ 直接就讲做法了 首先对每个串建出$AC$自动机 将$fail$树找到 然后求出$dfs$序 我们发现一个单词 $S_i$是$S_j$的子串当且仅当$S ...
- 【BZOJ2905】背单词 fail树+DFS序+线段树
[BZOJ2905]背单词 Description 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使得其中的每个单词是后一个单词的子串,最大化子序列中W的和. Input 第一行 ...
- 做中学(Learning by Doing)之背单词-扇贝网推荐
做中学(Learning by Doing)之背单词-扇贝网推荐 看完杨贵福老师(博客,知乎专栏,豆瓣)的「继续背单词,8个月过去了」,我就有写这篇文章的冲动了,杨老师说: 有时候我会感觉非常后悔,如 ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- BZOJ4567[Scoi2016]背单词
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status] ...
- 《我爱背单词》 Alpha版 发布说明
——发布地址(baidu网盘) http://pan.baidu.com/s/15omtB ——简介 <我爱背单词>是一款英语单词记忆和管理辅助软件,旨在帮助广大考生在短期内攻克GRE. ...
- [No000057]一个人默默背单词,小心被传染哦
不日凛冬将至,全国各地,已有多名少侠因季节变化,出现了不同程度的四肢不勤.bd不分的症状.具体表现为—— 包大人在此高能预警:不想背单词,有可能你已经被传染了. 好好的,怎么突然不想背单词了 哈佛医学 ...
- [No000014]听说不背单词,考英语会是这种下场-我们为什么必须背单词?
由于英语对于一个程序员来说,重要性你懂得.因此我会开始逐渐在博客上加入英语的一些东西. 听说不背单词,考英语会是这种下场 在中国, 「学英语」大抵遵循着这样一条 罗蒙诺索夫质量守恒定律 因为英语学着学 ...
- Supermemo背单词7周年纪念
从2007年2月1日开始,用Supermemo背单词7周年了,在2013年11月21日将单词表Reset,重新开始Review以前背过的单词,并慢慢加入听写VOA时遇到的生词.
随机推荐
- 第11章 使用Vsftpd服务传输文件
章节简述: 本章节先通过介绍文件传输协议来帮助读者理解FTP协议的用处,安装vsftpd服务程序并逐条分析服务文件的配置参数. 完整演示vsftpd服务匿名访问模式.本地用户模式及虚拟用户模式的配置方 ...
- iso socket基础2
iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...
- HDU 1864最大报销额 01背包问题
B - 最大报销额 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- linux shell 字符串操作(长度,查找,替换)详解
linux shell 字符串操作(长度,查找,替换)详解 在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系 ...
- spring中注解的通俗解释
我们在没有用注解写spring配置文件的时候,会在spring配置文件中定义Dao层的bean,这样我们在service层中,写setDao方法,就可以直接通过接口调用Dao层,用了注解写法后,在配置 ...
- 【转】js onclick用法:跳转到指定URL
使用onclick跳转到其他页面/跳转到指定url ☆如果是本页显示可以直接用location,方法如下: ①onclick="javascript:window.location.hr ...
- debian下mysql主从配置
1.确保master/slave只有一份/etc/mysql/my.cnf , 不要在其他地方再有my.cnf (如/etc/my.cnf /usr/local之类) 2.master配置: 在[m ...
- 转载一篇关于ios静态库的文章
http://blog.csdn.net/zsomsom/article/details/9163635
- iOS 中的字体预览
要预览iOS的各种字体的效果,可以访问http://iosfonts.com
- WPF 将PPT,Word转成图片
在Office下,PowerPoint可以直接把每张幻灯片转成图片,而Word不能直接保存图片.所以只能通过先转换成xps文件,然后再转成图片. 一.PPT 保存为图片 /// <summary ...