博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 1213E Two Small Strings
阅读量:5313 次
发布时间:2019-06-14

本文共 1280 字,大约阅读时间需要 4 分钟。

中文题意

给个n,再给两个长度为2的字符串,要求构造一个长度为\(3n\)的字符串,a、b、c三个字母各n个,且构造出的字符串子串中不能出现给定的两个字符串。如果不存在这样的字符串,就输出NO

解题思路

首先生成a、b、c的6个全排列,然后,每种全排列以两种方式扩大n倍——举个例子,n为3时,对于acb,可以扩展成这两种:acbacbacbaaacccbbb。然后依次检查这12种字符串是否有满足要求的,有就输出,没有就代表没有了(可以考虑字符串排列的内部以及扩展后字符串之间的边界)

(虚拟赛时想到第一种扩展方式,把自己卡了以后,想到第二种,又把自己卡了,愣是想不到两种都试试……)

源代码

#include
#include
#include
const int MAXN=3e5+5;int n;char mo[6][4]={"abc","acb","bac","bca","cab","cba"};char input[2][3];char s[MAXN];void check(){ for(int i=2;i<=n*3;i++) { if(s[i]==input[0][1]&&s[i-1]==input[0][0]||s[i]==input[1][1]&&s[i-1]==input[1][0]) return; } printf("YES\n%s",s+1); exit(0);}int main(){ scanf("%d%s%s",&n,input[0],input[1]); for(int m=0;m<6;m++) { for(int i=1;i<=n;i++)//然后一个奇怪的地方,我之前提交的时候input数组开到[2][2],输入时显然溢出了,但是输入那里不报错,反而这个循环不会进入,就是i这个循环。m那个循环进来了,然后直接进入check函数。为什么嘞……留坑 { s[(i-1)*3+1]=mo[m][0]; s[(i-1)*3+2]=mo[m][1]; s[(i-1)*3+3]=mo[m][2]; } check(); for(int i=1;i<=n;i++) { s[i]=mo[m][0]; s[i+n]=mo[m][1]; s[i+n+n]=mo[m][2]; } check(); } puts("NO"); return 0;}

本博客第一篇被打上构造标签的博文(真该打个标签叫智商

转载于:https://www.cnblogs.com/wawcac-blog/p/11464774.html

你可能感兴趣的文章
[转]Java连接各种数据库的方法
查看>>
项目经理如何把工作简单化
查看>>
【笔记】html的改变(上)
查看>>
String(三)
查看>>
ABAP术语-Application Server
查看>>
Spring的IOC原理
查看>>
Ubuntu学习
查看>>
见鬼吧,拉格朗日插值法
查看>>
HBase简介及原理
查看>>
团队-象棋游戏-代码设计规范
查看>>
javascript中对象的深复制的几种方法
查看>>
缓冲区溢出攻击
查看>>
【转】RESTful Web Services初探
查看>>
分享一下我习惯用的快捷键
查看>>
最近在思考CRM的相关事情!
查看>>
狗熊掰棒子之重拾棒子之JavaScript篇
查看>>
flavor用法
查看>>
upbeat用法
查看>>
IE浏览器样式表限制
查看>>
linux sar命令详解
查看>>