#Manacher,并查集#洛谷 3279 [SCOI2013]密码
分析
这些回文长度可以提供相等或者不等的信息,
不等的直接连边强制不等,相等用并查集合并连通块,
但是这样判断是\(O(n^2)\),考虑这些回文长度当用Manacher求时,
所有的回文长度都会在\(O(n)\)的时间内求出来,
所以可以模拟Manacher的过程完成上述操作,时间复杂度\(O(n)\)
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011; struct node{int y,next;}e[N<<2];
int p[N<<1],f[N],et=1,n,as[N],col[N],v[31],upd,Mx;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
inline signed getf(int u){return f[u]==u?u:f[u]=getf(f[u]);}
inline void Merge(int x,int y){
rr int fa=getf(x),fb=getf(y);
if (fa!=fb) f[fa]=fb;
}
inline void add(int x,int y){
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
signed main(){
n=iut(),Mx=n<<1|1,p[1]=p[Mx]=1;
for (rr int i=1;i<=n;++i) p[i<<1]=iut()+1;
for (rr int i=1;i<=n;++i) f[i]=i;
for (rr int i=1;i<n;++i) p[i<<1|1]=iut()+1;
rr int mid=1,mx=1;
for (rr int i=2;i<=n*2;++i){
rr int now=i<mx?min(p[mid*2-i],mx-i):1;
for (rr int j=now;j<p[i];++j)
if (!((i-j)&1)&&!((i+j)&1))
Merge((i-j)>>1,(i+j)>>1);
if (p[i]<i&&i+p[i]<=Mx) add((i-p[i])>>1,(i+p[i])>>1);
if (i+p[i]-1>mx) mid=i,mx=i+p[i]-1;
}
for (rr int i=1;i<=n;++i)
if (!col[getf(i)]){
v[0]=++upd;
for (rr int j=as[i];j;j=e[j].next)
if (e[j].y) v[col[getf(e[j].y)]]=upd;
while (v[col[getf(i)]]==upd) ++col[getf(i)];
}
for (rr int i=1;i<=n;++i) putchar(col[getf(i)]+96);
return 0;
}
#Manacher,并查集#洛谷 3279 [SCOI2013]密码的更多相关文章
- 【简单数据结构】并查集--洛谷 P1111
题目背景 AA地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数NN,和公路数MM,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你 ...
- 【洛谷】P5348 密码解锁
[洛谷]P5348 密码解锁 很显然我们可以推导出这个式子 设\(a(m)\)为\(m\)位置的值 \[ \mu(m) = \sum_{m | d} a(d) \\ a(m) = \sum_{m|d} ...
- 【BZOJ-2342】双倍回文 Manacher + 并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1799 Solved: 671[Submit][Statu ...
- BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...
- 洛谷 U6850 手机密码
U6850 手机密码 题目背景 小明的手机上设了一个由四个数字组成的密码,但是小明自己的记性不好,但又不想把密码直接记在纸上,于是便想了一个方法. 题目描述 小明有四行数字,每行数字都有n[i](&l ...
- [NOIP2012] 提高组 洛谷P1079 Vigenère 密码
题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...
- 洛谷 P1914 小书童——密码【字符串+模拟】
P1914 小书童——密码 题目背景 某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且 ...
- 洛谷——P1920 成功密码
P1920 成功密码 题目描述 void_rank匪别人的书来看,原本想看杂志颓废的,结果不小心拿错拿成了被导师称作旁门左道的高中数学杂志<成功密码>.数学差得不行的void_rank实在 ...
- 洛谷P1481 魔族密码(LIS)
题意 题目链接 给出一堆字符串,若一个串是另一个串的前缀 ,那么它们可以连接在一起 问最大的链接长度 Sol LIS沙比提其实是做完了才看出是LIS #include<cstdio> #i ...
- 洛谷P1079 Vigenère 密码
题目链接:https://www.luogu.org/problemnew/show/P1079
随机推荐
- 2021-09-15 JavaScript中强制将某个未知类型变量转成基础数据类型
为什么要强制将某个未知类型变量转成基础数据类型? 实际业务场景里,一个变量的数据是否合法或符合预期,会影响到自己的代码的可靠性.比如在别人使用自己写的自定义函数,而自己写的函数中的一些值是需要对入参严 ...
- 学会了Java 8 Lambda表达式,简单而实用
OneAPM 摘要:此篇文章主要介绍Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系OneAPM工程师编译整理. Java是一流的面向对象语言,除了 ...
- kafka 工作流程及文件存储机制
1.kafka的数据存储 文件存储格式: .log 和 .index Kafka 中消息是以 topic 进行分类的, 生产者生产消息,消费者消费消息,都是面向 topic的. topic ...
- DOSBox0.74使用Debug时p命令报错
环境 操作系统:Windows 10 DOSBox 0.74 DEBUG.EXE 从 Windows XP 或其他复制到的DOSBox下 问题 在学习到 王爽的<汇编语言>时,第 4章,第 ...
- centos7 开机自动执行脚本
1.因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2.赋予脚本可执行权限假设/usr/loc ...
- notion database 必知必会
notion database 必知必会 用过 mysql 的同学一定很容易上手 notion .在 notion 中,掌握好 database,基本上就掌握了 notion 最核心的概念. noti ...
- evalFn 字符串转执行函数 附带JSONParse函数
const evalFn = (fn) => { var Fun = Function // 一个变量指向Function,防止前端编译工具报错 return new Fun('return ' ...
- vue 下 placeholder 修改颜色
input::placeholder{ color:#585c89 !important; }
- Navicat 通过 Http通道 连接远程 Mysql
https://jingyan.baidu.com/article/3d69c551aa54dff0cf02d7a0.html 注意本机ip填写 localhost
- SAE自动驾驶分级介绍
SAE International 国际自动机工程师学会(原译:美国汽车工程师学会)英文全程为:Society of Automotive Engineers International,是一个全球性 ...