博客
关于我
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/

你可能感兴趣的文章
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>