前置芝士

  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. NOIP--模拟—————神奇的幻方

    神奇的幻方 题目描述 幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,-N x N 构成,且每行.每列及两条对角线上的数字之和都相同. 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先 ...

  2. Linux内核5.6亮点

    导读 当我们还在体验 Linux 5.5 稳定发行版带来更好的硬件支持时,Linux 5.6 已经来了.我将在本文中重点介绍 Linux 5.6 发布版中值得期待的关键更改和功能. 说实话,Linux ...

  3. C do...while 循环

    不像 for 和 while 循环,它们是在循环头部测试循环条件.在 C 语言中,do...while 循环是在循环的尾部检查它的条件. do...while 循环与 while 循环类似,但是 do ...

  4. 使用Eclipse工具开发Servlet(新建web项目->创建Servlet->部署和访问Servlet)

    在Eclipse工具栏中的[File]->[New]->[Other],打开如下菜单栏,选择Dynamic Web Project 点击下一步,如下图所示: 这里Dynamic web m ...

  5. Python使用Tensorflow出现错误: UserWarning: The default mode, 'constant'

    Python使用Tensorflow出现错误: UserWarning: The default mode, 'constant', will be changed to 'reflect' in s ...

  6. Django 单元测试笔记

    引言 关于单元测试的基本知识这里不再讲述,简单一句话:单元测试是用一段代码去测试另一段代码.最常用的框架是unittest,这是python的单元测试框架,而django单元测试框架test.Test ...

  7. 容器远程访问vnc--CentOS 6.8安装和配置VNC

    对于用惯了WIN系统的朋友来说,没有图形化操作界面的Linux用起来实在太难受了.实际上,Linux也是有图形化操作界面的,这就是VNC.接下来本文将告诉大家如何在CentOS 6.8下安装和配置 V ...

  8. 验证码 倒计时 vue 操作对象

    //html <input type="number" v-model="phoneNumber" placeholder="请输入手机号&qu ...

  9. 【PAT甲级】1047 Student List for Course (25 分)

    题意: 输入两个正整数N和K(N<=40000,K<=2500),接下来输入N行,每行包括一个学生的名字和所选课程的门数,接着输入每门所选课程的序号.输出每门课程有多少学生选择并按字典序输 ...

  10. 5G新时代开启,你会选择哪家运营商?

    牌照正式发放后,5G新时代正式来临.而5G时代显然开了个好头,B站UP主"老师好我叫何同学"发布的<有多快?5G在日常使用中的真实体验>视频,引爆全网.除了仅在B站就获 ...