博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「雅礼集训 2017 Day7」事情的相似度
阅读量:7091 次
发布时间:2019-06-28

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

「雅礼集训 2017 Day7」事情的相似度

我们先将字符串建后缀自动机。然后对于两个前缀\([1,i]\)\([1,j]\),他们的最长公共后缀长度就是他们在\(fail\)树上对应节点的\(lca\)\(maxlen\)

所以现在问题就变成了一个树上问题:给定一棵树,每个点有一个权值\((mxlen)\),询问编号在一段区间内的点两两之间\(lca\)权值的最大值。

方法很多,这里用的\(dsu\ on\ tree\)。对于每个点\(v\),我们计算其作为\(lca\)的贡献。显然贡献的情况是一个点对,他们在\(v\)的不同子树中(\(v\)自己也算一个子树)。但是这样点对的数量可能达到\(O(n^2)\)

不过我们仔细思考一下就会发现,其实这样的点对不多。对于一个\(lca\),一个子节点\(v\),我们要与一个在之前已经加入的节点,我们发现,根据贪心,只需要与\(v\)的前驱和后继组合就可以了。

代码:

#include
#define ll long long#define N 200005using namespace std;inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}int n,m;char s[N];int ch[N<<1][2],fail[N<<1],mxlen[N<<1];int id[N<<1];int cnt=1,last=1;void Insert(int f,int i) { static int now,p; now=++cnt; p=last,last=now; id[now]=i; mxlen[now]=mxlen[p]+1; while(p&&!ch[p][f]) ch[p][f]=now,p=fail[p]; if(!p) return fail[now]=1,void(); int q=ch[p][f]; if(mxlen[q]==mxlen[p]+1) return fail[now]=q,void(); int New=++cnt; memcpy(ch[New],ch[q],sizeof(ch[q])); fail[New]=fail[q]; fail[q]=fail[now]=New; mxlen[New]=mxlen[p]+1; while(p&&ch[p][f]==q) ch[p][f]=New,p=fail[p];}struct load {int to,next;}e[N<<2];int h[N<<1],edge=1;void add(int i,int j) {e[++edge]=(load) {j,h[i]};h[i]=edge;}int val[N<<1];int size[N<<1],son[N<<1];void dfs(int v) { size[v]=1; for(int i=h[v];i;i=e[i].next) { int to=e[i].to; dfs(to); size[v]+=size[to]; if(size[son[v]]
pos;set
::iterator it;void statis(int v,int flag) { if(id[v]) { if(flag) pos.insert(id[v]); else pos.erase(id[v]); } for(int i=h[v];i;i=e[i].next) { int to=e[i].to; statis(to,flag); }}struct node { int l,r,mx; bool operator <(const node &a)const {return r

转载于:https://www.cnblogs.com/hchhch233/p/10094639.html

你可能感兴趣的文章
keepalived+haproxy高可用
查看>>
比特币量化交易
查看>>
Python经典面试题 之 is 和 == 的区别
查看>>
DNS简介
查看>>
微信环境中如何实现点击链接自动直接跳转到手机外部默认浏览器
查看>>
dg切换操作文档
查看>>
I - 剪枝 0。O HDU - 1455 Sticks DFS
查看>>
Oracle 数据库实例启动关闭过程
查看>>
OGG 安全特性--网络传输加密
查看>>
让U盘隐藏文件无处可逃
查看>>
hadoop2.7【单节点】单机、伪分布、分布式安装指导
查看>>
ssh-copy-id使用非默认22端口
查看>>
ruby 基础知识(一)
查看>>
PHP 统计数组元素个数
查看>>
pkgconfig问题,在安装rrdtool的时候,编译又这个问题
查看>>
也谈谈Apache与Nginx
查看>>
也谈用友被面试经历【去年杭州用友被拒】
查看>>
Javascript基础系列之(二)变量
查看>>
vim 常用配置
查看>>
AJAX请求总结
查看>>