题解

给一个

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,y​Gy,x​ Gx,y​(middle)Gy,z​ Gz,y​Gy,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(构造)的更多相关文章

  1. 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 ...

  2. CodeForces 916C Jamie and Interesting Graph (构造)

    题意:给定两个数,表示一个图的点数和边数,让你构造出一个图满足 1-  n 的最短路是素数,并且最小生成树也是素数. 析:首先 1 - n 的最短路,非常好解决,直接 1 连 n 就好了,但是素数尽量 ...

  3. CodeForces 404C Restore Graph (构造)

    题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久 ...

  4. 2017icpc乌鲁木齐网络赛Colored Graph (构造)

    题目 https://nanti.jisuanke.com/t/16958 题意 给定一个n(n<=500)个点的无向图,给每条边黑白染色,输出同色三角形最少的个数和对应的方案 分析 首先考虑给 ...

  5. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  6. HDU4467:Graph(点的度数分块)

    传送门 题意 给出一张n个点m条边的无向图,点的颜色为0/1,每次有两种操作: 1.Asksum x y,查询两点颜色为x和y的边的权值之和 2.Change x,将x颜色取反 分析 最直接的做法是每 ...

  7. CF1481X Codeforces Round #699

    C Fence Painting(构造) 有用的刷子贪心刷,没用的刷子填在后续的有用/已存在的位置(用个栈记一下就行) D AB Graph(图上构造) 把边当做三种类型,aa bb ab m为奇数时 ...

  8. Leetcode#115 Distinct Subsequences

    原题地址 转化为求非重路径数问题,用动态规划求解,这种方法还挺常见的 举个例子,S="aabb",T="ab".构造如下地图("."表示空位 ...

  9. Android内存泄漏分析及调试

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...

随机推荐

  1. QQ空间未授权评论_已忽略

    看群友们聊天时发现的, 大概是做了查看了动态访问时间的一个设置, 但是仅自己可见的说说还是被评论了的这么一个问题. 闲的没事就翻了一下找一下问题. 这个方法嘎嘎鸡肋, 可以说完全没用, 交到tsrc, ...

  2. Linux/Ubuntu 安装Redis

    更新记录 2022年6月15日 发布. 2022年6月12日 开始编写. 安装Redis 更新源 sudo apt update 安装redis sudo apt install redis-serv ...

  3. python常用标准库(压缩包模块zipfile和tarfile)

    常用的标准库 在我们常用的系统windows和Linux系统中有很多支持的压缩包格式,包括但不限于以下种类:rar.zip.tar,以下的标准库的作用就是用于压缩解压缩其中一些格式的压缩包. zip格 ...

  4. javaweb获取客户端真实ip

    在安全性要求较高的web项目中,我们经常有这样的需求: 黑名单:禁止指定ip访问. 白名单:允许指定ip访问. 根据ip追踪恶意入侵系统者. 在java中我们通常可以这样获取客户端ip地址: requ ...

  5. React中render Props模式

    React组件复用 React组件复用的方式有两种: 1.render Props模式 2.高阶组件HOC 上面说的这两种方式并不是新的APi. 而是利用Raect自身的编码特点,演化而来的固定编码写 ...

  6. 多台云服务器的 Kubernetes 集群搭建

    环境 两台或多台腾讯云服务器(本人搭建用了两台),都是 CentOs 7.6, master 节点:服务器为 4C8G,公网 IP:124.222.61.xxx node1节点:服务器为 4C4G,公 ...

  7. 一条update语句到底加了多少锁?带你深入理解底层原理

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...

  8. 面向对象的封装(粘贴Markdown代码解决缩进问题)

    直接粘贴idea的代码会导致缩进错乱,建议先粘贴到记事本再粘贴到笔记!!! 1.先将属性私有化,再对外提供简单的接口可以访问内部.如set.get方法 2.set方法:修改年龄 public void ...

  9. pytorch 基础内容

    一些基础的操作: import torch as th a=th.rand(3,4) #随机数,维度为3,4的tensor b=th.rand(4)print(a)print(b) a+b tenso ...

  10. 挑战30天写操作系统-day3-进入32位模式并导入C语言

    目录 1.制作真正的IPL IPL:启动区,启动程序装载器完整代码: ; haribote-ipl ; TAB=4 CYLS EQU 10 ; 声明CYLS=10 ORG 0x7c00 ; 指明程序装 ...