(题干中的废话已经划去)

dp显而易见

收益为负数的可以直接扔掉不管。不要一定更优

子串问题,考虑SAM

建立广义SAM

尝试匹配,匹配到的位置的parent树祖先如果有完整的串,那么可以从这个串转移

考虑祖先不好考虑

不妨考虑i对j(i<j)的贡献,就是子树了

线段树维护dfn序,区间对val取max

SAM学傻了

这个,由于是"完整出现”,所以AC自动机就可以(比广义SAM好写好调)

走一走属于第j个串的路径,对应的fail树的祖先包含i(i<j)的结束位置,那么可以转移

所以,同理,走完i之后,整个fail树子树的dp值和val取max

但是注意一点,根节点标号是0(反正我trie都这样写)

代码:

#include<bits/stdc++.h>
#define il inline
#define int long long
#define reg register int
#define mid ((l+r)>>1)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
int n,m;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
char s[N],b[N];
int len[N],st[N];
ll v[N],f[N];
int dfn[N],dfn2[N];
int df;
struct seg{
ll mx;
ll tag;
}t[*N];
void pushup(int x){
t[x].mx=max(t[x<<].mx,t[x<<|].mx);
}
void pushdown(int x){
if(t[x].tag<=) return;
t[x<<].tag=max(t[x<<].tag,t[x].tag);
t[x<<].mx=max(t[x<<].mx,t[x].tag); t[x<<|].tag=max(t[x<<|].tag,t[x].tag);
t[x<<|].mx=max(t[x<<|].mx,t[x].tag);
t[x].tag=;
}
void upda(int x,int l,int r,int L,int R,ll c){
if(L<=l&&r<=R){
t[x].mx=max(t[x].mx,c);
t[x].tag=max(t[x].tag,c);
return ;
}
pushdown(x);
if(L<=mid) upda(x<<,l,mid,L,R,c);
if(mid<R) upda(x<<|,mid+,r,L,R,c);
pushup(x);
}
ll query(int x,int l,int r,int p){
if(l==r){
return t[x].mx;
}
pushdown(x);
if(p<=mid) return query(x<<,l,mid,p);
else return query(x<<|,mid+,r,p);
}
void cle(int x,int l,int r){
t[x].mx=;t[x].tag=;
if(l==r) return;
cle(x<<,l,mid);cle(x<<|,mid+,r);
}
struct AC{
int fail[N],ch[N][];
int cnt;
void ins(char *s,int l){
//int len=strlen(s+1);
int now=;
for(reg i=;i<=l;++i){
int c=s[i]-'a';
if(!ch[now][c]) ch[now][c]=++cnt;
now=ch[now][c];
}
}
void build(){
queue<int>q;
for(reg i=;i<;++i){
if(ch[][i]) fail[ch[][i]]=,q.push(ch[][i]);
}
while(!q.empty()){
int x=q.front();q.pop();
for(reg i=;i<;++i){
if(ch[x][i]){
fail[ch[x][i]]=ch[fail[x]][i];
q.push(ch[x][i]);
}
else ch[x][i]=ch[fail[x]][i];
}
}
for(reg i=;i<=cnt;++i){
add(fail[i],i);
}
}
void clear(){
memset(fail,,sizeof fail);
cnt=;
memset(ch,,sizeof ch);
}
void dfs(int x){
dfn[x]=++df;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
dfs(y);
}
dfn2[x]=df;
}
ll wrk(char *s,int l,int id){
ll ret=;
int now=;
for(reg i=;i<=l;++i){
int c=s[i]-'a';
now=ch[now][c];
// cout<<"now "<<now<<" i "<<i<<" dfn "<<dfn[now]<<endl;
ret=max(ret,query(,,df,dfn[now]));
}
// cout<<dfn[now]<<".. "<<dfn2[now]<<endl;
upda(,,df,dfn[now],dfn2[now],ret+v[id]);
return ret;
}
}ac;
void clear(){
ac.clear();
if(df)cle(,,df);
df=;cnt=;
n=;
memset(hd,,sizeof hd); }
int main(){
//return 0;
int t;
rd(t);
while(t--){
clear();
rd(m);
int tot=;
for(reg i=;i<=m;++i){
scanf("%s",b+);
scanf("%lld",&v[i]);
st[i]=tot+;
len[i]=strlen(b+);
for(reg j=tot+;j<=tot+len[i];++j){
s[j]=b[j-tot];
}
tot=tot+len[i];
ac.ins(b,len[i]);
}
// cout<<" after ac.ins "<<endl;
ac.build();
ac.dfs();//find dfn
ll ans=;
// cout<<" let's wrk "<<endl;
for(reg i=;i<=m;++i){
// cout<<" ii "<<i<<"--------------------"<<v[i]<<" len "<<len[i]<<" st "<<st[i]<<endl;
//if(v[i]<=0) continue;
for(reg j=st[i];j<=st[i]+len[i]-;++j){
b[j-st[i]+]=s[j];
}
// cout<<b+1<<endl;
f[i]=ac.wrk(b,len[i],i)+v[i];
// cout<<i<<" : "<<f[i]<<endl;
ans=max(ans,f[i]);
}
printf("%lld\n",ans);
}
return ;
} }
signed main(){
freopen("2963.in","r",stdin);
freopen("2963.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/3 11:36:24
*/

fzyjojP2963 -- [校内训练20161227]疫情控制问题的更多相关文章

  1. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  2. 【NOIP2012】 疫情控制

    [NOIP2012] 疫情控制 标签: 倍增 贪心 二分答案 NOIP Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  3. Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增)

    Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增) Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  4. [NOIP2012]疫情控制 贪心 二分

    题面:[NOIP2012]疫情控制 题解: 大体思路很好想,但是有个细节很难想QAQ 首先要求最大时间最小,这种一般都是二分,于是我们二分一个时间,得到一个log. 然后发现一个军队,越往上走肯定可以 ...

  5. 疫情控制 blockade

    疫情控制 blockad 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当 ...

  6. codevs1218 疫情控制

    疫情控制(blockade.cpp/c/pas)[问题描述]H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点.H 国的首都爆发了一种危害 ...

  7. 疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  8. CH6301 疫情控制

    6301 疫情控制 0x60「图论」例题 描述 H国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病. ...

  9. luoguP1084 疫情控制(题解)(搜索+贪心)

    luoguP1084 疫情控制 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include& ...

随机推荐

  1. ELK环境搭建

    ELK环境搭建 1. Virtualbox/Vagrant安装 41.1. Virtualbox安装 41.2. Vagrant安装 41.2.1. 简述 41.2.2. Vagrant box 41 ...

  2. AlexNet——ImageNet Classification with Deep Convolutional Neural Networks

    1. 摘要 本文的模型采用了 5 层的卷积,一些层后面还紧跟着最大池化层,和 3 层的全连接,最后是一个 1000 维的 softmax 来进行分类. 为了减少过拟合,在全连接层采取了 dropout ...

  3. (转)一个简单的rest_framework demo

    转发:https://www.cnblogs.com/fu-yong/p/9100559.html models.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from ...

  4. Redux和React-Redux的实现(三):中间件的原理和applyMiddleware、Thunk的实现

    现在我们的Redux和React-Redux已经基本实现了,在Redux中,触发一个action,reducer立即就能算出相应的state,如果我要过一会才让reducer计算state呢怎么办?也 ...

  5. Dailu Scrum (2015/10/27)

    在周日晚上PM已经为大家分配了部分的代码修改工作,今天晚上PM召集了被分配代码工作的3个DEV一起讨论要求修改的代码.在共同讨论的过程中确有发现以下代码的不规范之处,PM当即要求我们先要修改规范代码的 ...

  6. 对cnblogs.com的用户体验

    1.你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我们是计算机专业学生,是奔向神奇的代码世界的旅人.希望在cnblogs上找到自己感兴趣的技术,并学到更多的知识,提升自己的 ...

  7. cron延时

    2)Cron表达式范例: 每隔5秒执行一次:*/5 * * * * ? 每隔1分钟执行一次:0 */1 * * * ? 每天23点执行一次:0 0 23 * * ? 每天凌晨1点执行一次:0 0 1 ...

  8. 11th 单元测试工具JUnit的学习

    1.写好一个简易的四则运算的程序 UnitTest类文件: public class UnitTest { int a; int b; int answer;//正确答案 public int plu ...

  9. 基于 Jmeter 的 web 端接口自动化测试平台

    简介 基于之前的react+unittest+flask的接口自动化平台开发经验,和趟过的坑,我重新开发了这个接口自动化平台.平台前端采用的antd+dva+umi的antd-pro模板,结合平台业务 ...

  10. Redis在Windows环境下单机安装及远程访问方案

    一.下载Windows版Redis 打开https://github.com/MicrosoftArchive/redis/tags地址,找到最新版Redis安装包(Redis-x64-3.2.100 ...