博客
关于我
Codeforces1437 G. Death DBMS(AC自动机)
阅读量:218 次
发布时间:2019-03-01

本文共 2313 字,大约阅读时间需要 7 分钟。

题意:

给定n个串si,一开始每个串的权值为0,

m次操作,操作有两种:
(1 i x):将第i个串的权值设为x,
(2 q):给定串q,在n个串中找到一个最大权值的串,满足这个串是q的子串,输出最大权值,如果不存在子串,那么输出-1。

数据范围:n,m<=3e5,sum(|si|),sum(|q|)<=3e5

解法:

对n个串建AC自动机,每个节点开一个multiset维护最大值,修改操作直接修改multiset中的元素,查询操作就暴力跳last,对经过的节点的multiset的取max.

code:

#include
using namespace std;const int maxm=3e5+5;char s[maxm];int n,m;struct AC{ int a[maxm][26]; int ed_pos[maxm]; int val[maxm]; int fail[maxm]; int last[maxm]; int tot; multiset
ss[maxm]; void add(char *s,int idx){ int node=0; for(int i=0;s[i];i++){ int v=s[i]-'a'; if(!a[node][v])a[node][v]=++tot; node=a[node][v]; } ed_pos[idx]=node; val[idx]=0;//这里必须val[idx],不能val[node],因为node会重复 ss[node].insert(val[idx]); } void build(){ for(int i=0;i<=tot;i++){ ss[i].insert(-1); } queue
q; for(int i=0;i<26;i++){ if(a[0][i]){ fail[a[0][i]]=0; q.push(a[0][i]); } } while(!q.empty()){ int x=q.front();q.pop(); last[x]=*ss[fail[x]].rbegin()>=0?fail[x]:last[fail[x]]; for(int i=0;i<26;i++){ if(a[x][i]){ fail[a[x][i]]=a[fail[x]][i]; q.push(a[x][i]); }else{ a[x][i]=a[fail[x]][i]; } } } } void update(int idx,int x){ int pos=ed_pos[idx]; ss[pos].erase(ss[pos].find(val[idx])); val[idx]=x; ss[pos].insert(val[idx]); } int ask(char *s){ int ans=-1; int node=0; for(int i=0;s[i];i++){ int v=s[i]-'a'; node=a[node][v]; for(int t=node;t;t=last[t]){ ans=max(ans,*ss[t].rbegin()); } } return ans; }}ac;signed main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%s",s); ac.add(s,i); } ac.build(); while(m--){ int op;scanf("%d",&op); if(op==1){ int i,x;scanf("%d%d",&i,&x); ac.update(i,x); }else{ scanf("%s",s); int ans=ac.ask(s); printf("%d\n",ans); } } return 0;}

转载地址:http://hskv.baihongyu.com/

你可能感兴趣的文章
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>