[CF1481D] AB Graph(构造)
题解
给一个
n
\tt n
n 个点的完全有向图,
(
u
,
v
)
\tt(u,v)
(u,v) 或者
(
v
,
u
)
\tt(v,u)
(v,u) 都有一条边,前提是
u
≠
v
\tt u\not=v
u=v 。
每条边的边权是字符 a
或字符 b
,会给你一个
n
×
n
\tt n\times n
n×n 的二维字符表
G
\tt G
G 来表示它们,若
i
≠
j
\tt i\not=j
i=j ,则
G
i
,
j
=
a
\tt G_{i,j}=a
Gi,j=a 或
G
i
,
j
=
b
\tt G_{i,j}=b
Gi,j=b ,否则
G
i
,
j
=
∗
\tt G_{i,j}=*
Gi,j=∗ ,表示该边不存在。
现在问你,从任意一个起点开始,走
m
\tt m
m 步(可以经过重复的点或边)形成的字符串,是否可以为回文串?如果有,输出行走方案。
T
≤
500
\tt T\leq 500
T≤500 组数据,
∑
n
≤
1000
,
∑
m
≤
1
0
5
\tt \sum n\leq1000,\sum m\leq10^5
∑n≤1000,∑m≤105 。
题解
一眼看过去,貌似是道
D
P
\tt DP
DP ?以前做过路径为回文串的题。
但是这题没必要,因为评分只有2000,明显可以直接分类讨论。
对于
m
\tt m
m 是奇数的情况,我们可以任意找两个点,反复跳,容易发现结果定是回文串。也就是说,这种情况下一定有解。
如果
m
\tt m
m 是偶数,这样讨论:
- 若存在一对点
u
,
v
\tt u,v
u,v ,满足
G
u
,
v
=
G
v
,
u
\tt G_{u,v}=G_{v,u}
Gu,v=Gv,u ,那么直接在这两个点之间跳。这明显是无懈可击的方案。
- 否则,整个图满足对于任意两个不相等的点
u
,
v
\tt u,v
u,v ,
G
u
,
v
,
G
v
,
u
\tt G_{u,v},G_{v,u}
Gu,v,Gv,u 其中一个是
a
,另一个是b
。然后,我们找这么三个点x
,
y
,
z
\tt x,y,z
x,y,z (
x
≠
y
,
y
≠
z
\tt x\not=y,y\not=z
x=y,y=z),满足
G
x
,
y
=
G
y
,
z
\tt G_{x,y}=G_{y,z}
Gx,y=Gy,z,令这两条边为最中心的两条边,那么整个回文串为
.
.
.
G
x
,
y
G
y
,
x
G
x
,
y
(
m
i
d
d
l
e
)
G
y
,
z
G
z
,
y
G
y
,
z
.
.
.
\tt ...G_{x,y}G_{y,x}~G_{x,y}(middle)G_{y,z}~G_{z,y}G_{y,z}...
...Gx,yGy,x Gx,y(middle)Gy,z Gz,yGy,z... ,左右两边都是交替出现的
ab
,且保证回文。 - 如果这三个点也找不到,那么说明不论这一步是什么字符,下一步一定是不一样的字符。这样是形不成偶数长度的回文串的,此时无解。
复杂度
Θ
(
m
)
\tt\Theta(m)
Θ(m) 。
CODE
#include<set>
#include<queue>
#include<bitset>
#include<cmath>
#include<ctime>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 1005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
#define INF 0x3f3f3f3f
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
char g[MAXN][MAXN];
int as[MAXN];
int main() {
int T = read();
while(T --) {
n = read();m = read();
for(int i = 1;i <= n;i ++) {
scanf("%s",g[i] + 1);
}
if(m & 1) {
printf("YES\n");
for(int i = 1;i <= m+1;i ++) printf("%d ",2-(i&1));ENDL;
}
else {
s = o = 0;
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= n;j ++) {
if(g[i][j] == g[j][i] && i != j) {s = i;o = j;break;}
}
}
if(s && o) {
printf("YES\n");
for(int i = 1;i <= m+1;i ++) printf("%d ",(i&1) ? s:o);ENDL;
}
else {
int cen = 0;
s = o = 0;
for(int i = 1;i <= n;i ++) {
int pa = 0,pb = 0;
for(int j = 1;j <= n;j ++) {
if(g[j][i] == 'a') pa = j;
if(g[j][i] == 'b') pb = j;
}
for(int j = 1;j <= n;j ++) {
if(g[i][j] == 'a' && pa) {s = pa;o = j;}
if(g[i][j] == 'b' && pb) {s = pb;o = j;}
}
if(s && o) {cen = i;break;}
}
if(cen) {
printf("YES\n");
m ++;
int md = (m+1)/2;
as[md] = cen;
as[md-1] = s;
as[md+1] = o;
for(int i = md-2;i > 0;i --) {
if(as[i+1] == s) as[i] = cen;
else as[i] = s;
}
for(int i = md+2;i <= m;i ++) {
if(as[i-1] == o) as[i] = cen;
else as[i] = o;
}
for(int i = 1;i <= m;i ++) printf("%d ",as[i]);ENDL;
}
else printf("NO\n");
}
}
}
return 0;
}
[CF1481D] AB Graph(构造)的更多相关文章
- HDU 4725 The Shortest Path in Nya Graph [构造 + 最短路]
HDU - 4725 The Shortest Path in Nya Graph http://acm.hdu.edu.cn/showproblem.php?pid=4725 This is a v ...
- CodeForces 916C Jamie and Interesting Graph (构造)
题意:给定两个数,表示一个图的点数和边数,让你构造出一个图满足 1- n 的最短路是素数,并且最小生成树也是素数. 析:首先 1 - n 的最短路,非常好解决,直接 1 连 n 就好了,但是素数尽量 ...
- CodeForces 404C Restore Graph (构造)
题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久 ...
- 2017icpc乌鲁木齐网络赛Colored Graph (构造)
题目 https://nanti.jisuanke.com/t/16958 题意 给定一个n(n<=500)个点的无向图,给每条边黑白染色,输出同色三角形最少的个数和对应的方案 分析 首先考虑给 ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- HDU4467:Graph(点的度数分块)
传送门 题意 给出一张n个点m条边的无向图,点的颜色为0/1,每次有两种操作: 1.Asksum x y,查询两点颜色为x和y的边的权值之和 2.Change x,将x颜色取反 分析 最直接的做法是每 ...
- CF1481X Codeforces Round #699
C Fence Painting(构造) 有用的刷子贪心刷,没用的刷子填在后续的有用/已存在的位置(用个栈记一下就行) D AB Graph(图上构造) 把边当做三种类型,aa bb ab m为奇数时 ...
- Leetcode#115 Distinct Subsequences
原题地址 转化为求非重路径数问题,用动态规划求解,这种方法还挺常见的 举个例子,S="aabb",T="ab".构造如下地图("."表示空位 ...
- Android内存泄漏分析及调试
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...
随机推荐
- Java系列之运算符
运算符 算术运算符:+ (加).-(减) .*(乘)./(除).%(模).++(自增) . --(自减) 赋值运算符:= 关系运算符:>.<.>= <= == != insta ...
- MongoDB学习总览
第1部分: MongoDB入门(第1~6章) 该部分介绍MongoDB的基本概念及入门知识. 通过该部分的学习,读者可对MongoDB自身的技术全貌形成一定的认识. 第2部分: MongoDB微服务开 ...
- JVM学习笔记-从底层了解程序运行(一)
1:JVM基础知识 什么是JVM 1. java虚拟机,跨语言的平台,实现java跨平台 2. 可以实现多种语言跨平台,只要该语言可以编译成.class文件 3. 解释执行.class文件 java是 ...
- BUUCTF-小明的保险箱
小明的保险箱 16进制打开可以发现存在一个RAR压缩包,压缩包里面应该就是flag文本 使用ARCHPR破解即可
- Python基础学习笔记_02
Python中的运算符 标准算术运算符 加(+) 减(-) 乘(*) 除(/) 整除(//) print(1+1) #加法运算 print(1-1) #减法运算 print(2*4) #乘法运算 pr ...
- 使用Java编写一个日期时间封装类
package base; import java.util.GregorianCalendar; import java.util.StringTokenizer; import java.util ...
- [.NET6]使用ML.NET+ONNX预训练模型整活B站经典《华强买瓜》
最近在看微软开源的机器学习框架ML.NET使用别人的预训练模型(开放神经网络交换格式.onnx)来识别图像,然后逛github发现一个好玩的repo.决定整活一期博客. 首先还是稍微科普一下机器学习相 ...
- GameFramework食用指南
1.框架简介 GF框架分两部分,GameFramework(GF)和UnityGameFramework(UGF): 通过接口的形式对Unity引擎进行了解耦: GF独立于Unity,具体业务逻辑实现 ...
- CTO与CIO选型数据中台的几大建议
企业数字化转型离不开企业数字化技术的配备.但企业在选择数字化技术时也面临着一个问题,就是如何在大胆采用先进的数字化技术和对技术进行投资之间找到平衡,将投资风险降到最低,毕竟错误的技术选型会给企业带来不 ...
- Markdown扩展语法
目录 Markdown 语法补充 一.快速生成 HTML 表格代码 在线表格编辑器--TablesGenerator 二. 插入视频.音频或GIF 1. 视频 2. 音频 方法一 方法二 方法三 3. ...