前置芝士

  1. 图的遍历:通过DFS或者BFS遍历全图.
  2. 前向星:用来存边,但是在本题用也可以用一个二维数组解决.

具体做法

先从判断YES和NO开始,可以发现如果一个字母与三个及以上不同的字母相邻时肯定是不合法的,每个字母与左右的字母连一条边以后如果产生一个长度大于2的环也是不合法的.所以最终合法的图中没有环,没有一个点连出两条以上的边,自然可以发现这就是一堆链了,所以可以从出度为1或0的点开始遍历,如果可以遍历全图自然就没有环了.

代码

#include<bits/stdc++.h>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i>=last;--i)
using namespace std;
int N,M,T,tot;
int out[114541];//出度
char s[114514];//字符串
bool visit[114514];//遍历时不可以遍历两次同一个点,所以需要记录一下
int answer[114514];//记录答案
//链式前向星
struct Edge
{
int next,to;
}edge[114514];
#define FOR(now) for(int _i_=head[now];_i_;_i_=edge[_i_].next)
#define SON edge[_i_].to
int cnt=0;
int head[1111];
bool p[233][233];//判断两字母是否相邻
void AddEdge(int form,int to)//加边
{
edge[++cnt].to=to;
edge[cnt].next=head[form];
head[form]=cnt;
}
void DFS(int now)//DFS遍历
{
if(visit[now])//如果访问过就不再访问
{
return;
}
visit[now]=1;//修改为已经访问
answer[++tot]=now;//记录答案
FOR(now)
{
DFS(SON);
}
}
void work()
{
//注意初始化
REP(i,'a','z')
{
out[i]=0;
head[i]=0;
}
REP(i,'a','z')
REP(j,'a','z')
{
p[i][j]=0;
}
cnt=0;
tot=0;
cin>>s;
N=strlen(s)-1;
REP(i,1,N)
{
if(!p[s[i]][s[i-1]])//如果原来没有相邻
{
//连边
AddEdge(s[i],s[i-1]);
AddEdge(s[i-1],s[i]);
//两字母出度都++
out[s[i]]++;
out[s[i-1]]++;
if(max(out[s[i]],out[s[i-1]])>2)//如果出度大于2了就是NO
{
printf("NO\n");
return;
}
p[s[i]][s[i-1]]=p[s[i-1]][s[i]]=1;//改为已经相邻
}
}
REP(i,'a','z')
{
visit[i]=0;
}
REP(i,'a','z')//遍历全图
{
if(!visit[i])
{
if(out[i]<=1)//从出度为0,1的位置开始
DFS(i);
}
}
REP(i,'a','z')//如果有没有遍历到的点就是NO
{
if(!visit[i])
{
printf("NO\n");
return;
}
}
printf("YES\n");
REP(i,1,tot)printf("%c",answer[i]);//输出答案
printf("\n");
}
int main()
{
scanf("%d",&T);
REP(i,1,T)
work();
return 0;
}

「CF1303C Perfect Keyboard」的更多相关文章

  1. [CF1303C] Perfect Keyboard - DFS

    Solution 根据原字符串建图,每个字符是一个点,相邻则连边 然后从每一个度数为 \(1\) 的点开始爆搜连通块,合法情况下应该是一条链 #include <bits/stdc++.h> ...

  2. 对于前端,「微信小程序」其实不美好

    微信小程序开放公测了,9月底我曾经写过一篇 「微信小程序」来了,其中最后一句:"谢天谢地,我居然还是个前端". 这种火爆的新事物总是令人激动,感谢这个时代. 但是,当我真作为开发者 ...

  3. macOS安装「oh my zsh」

    目前常用的 Linux 系统和 OS X 系统的默认 Shell 都是 bash,但是真正强大的 Shell 是深藏不露的 zsh, 这货绝对是马车中的跑车,跑车中的飞行车,史称『终极 Shell』, ...

  4. 报名|「OneAPM x DaoCloud」技术公开课:Docker性能监控!

    如今,越来越多的公司开始 Docker 了,「三分之二的公司在尝试了 Docker 后最终使用了它」,也就是说 Docker 的转化率达到了 67%,同时转化时长也控制在 60 天内. 既然 Dock ...

  5. 企业运营对 DevOps 的「傲慢与偏见」

    摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...

  6. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

  7. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!

  8. Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.

    在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...

  9. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

随机推荐

  1. 一文搞懂vim复制粘贴

    转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/ 概述 复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻 ...

  2. Apache和Nginx配置默认访问index.php

    Apache: .htaccess文件配置 Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d R ...

  3. 1010 Radix (25分)

    改了一天也没明白,第7个数据是怎么卡的 #include <bits/stdc++.h> using namespace std; const int maxn=1005; typedef ...

  4. Ethereum Learning Materials

    Home 注:本页为 EthFans 站内文章精选集.鉴于文章的采集范围较广,我们无法保证文章内容没有重复,也不能保证排列的顺序实现了最优的认识路径.我们只能说,这些文章是我们精挑细选后,确认可以长期 ...

  5. Netty Learning Notes

    简介 Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端. ...

  6. 微信小程序解析HTML标签带有<p>

    小程序中默认是不支持html格式没有<p>标签,但是有些接口需要返回带有标签的,例如 : 隐私协议: 解决方法: 小程序中有一个富文本标签组件,前端可以解析H5标签就是 rich-text ...

  7. PS——"火龙"

    一.打开素材龙图案(因为老师给了素材,所以直接打开了) 二.Ctrl+J把背景图层复制一份,用魔棒工具把白色的背景去除(背景和龙的外围会出现蚂蚁线),Delete键清除,Ctrl+D取消选择 三.全选 ...

  8. LVS DR实验!

    =========================================================================== 操作图 设备:两台节点模拟机,一台调度机 调度机 ...

  9. SpringCloud全家桶学习之服务注册与发现及Eureka高可用集群搭建(二)

    一.Eureka服务注册与发现 (1)Eureka是什么? Eureka是NetFlix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故 ...

  10. mybatis Plus 多表联合查询

    //实体类package com.sk.skkill.entity; import com.baomidou.mybatisplus.annotation.TableField;import com. ...