前置芝士

  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. Re(正则表达式)库入门

    一.正则表达式的概念 正则表达式 "一行胜千言" regular expression regex RE 是用来简洁表达一组字符串的表达式. 'PN' 'PYN' 'PYTN' & ...

  2. 2020 安恒2月月赛 misc

    题目链接:https://pan.baidu.com/s/19l54Nukt6evOr4UgbHMXIQ 提取码:1qbs 0x01 lemonEssence 咦?在kali打开是出错,改宽后图片变了 ...

  3. Arctic Network(洛谷)--北极通讯网络(loj)

    洛谷传送门 loj传送门 一道蛮基础的最小生成树的题 题意也没绕什么圈子 只是叙述的有点累赘而已(loj上是这样的 也就读入加建边需要稍稍稍多想一下下 对于我这么一个蒟蒻 这是一道很好的板子题 (洛谷 ...

  4. 在虚拟机安装centos7

    因为工作需要,要经常用到虚拟机,以I前老让别人给装,可是老问人家也不好,自己整理一份比较适合小白用的教程,有点繁琐: 一.工具:VMware      CentOS7 的 ISO 文件 二.开始安装 ...

  5. 201771010135 杨蓉庆《面对对象程序设计(java)》第十八周学习总结

    1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: ...

  6. 分享Linux系统快速入门法

    相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什么要学习Linux,有的人是因为兴趣 ...

  7. RT_THREAD之组件学习

    CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪.定位,错误原因自动分析的开源库.支持 ...

  8. LNMP环境搭建(PHP7.4.0)

    目录 准备工作 安装wget 安装net-tools 安装vim 配置显示行号 关闭防火墙 安装Nginx 安装依赖 编译安装Nginx 配置环境变量 Systemd管理 安装MySQL 安装依赖 下 ...

  9. Fluent_Python_Part4面向对象,08-ob-ref,对象引用、可变性和垃圾回收

    第四部分第8章,对象引用.可变性和垃圾回收 1. 创建对象之后才会把变量分配给对象 变量是对象的标注,是对象的别名,是对象的引用,并不是对象存储的地方. 例子1. 证明赋值语句的右边先执行 class ...

  10. ZOJ4114 Flipping Game(2019山东省赛)

    有n个开关,有起始状态和终状态,问如果每次必须选m个开关进行改变状态,一共进行k次,那么有多少种方式可以从起始状态到终状态~ #include<bits/stdc++.h> using n ...