Content

有 \(t\) 次询问,每次询问给定一个字符串 \(s\)。定义一个“好的字符串”为不是回文串的字符串。对于每一次询问,求出任意一个重新排列能够得到的“好的字符串”,或者这不可能实现。

数据范围:\(1\leqslant t\leqslant 100,1\leqslant|s|\leqslant 1000\)。

Solution

首先我们来判断一下,什么样的情况下一个回文串无法变成一个非回文串?显然是这个回文串里面只有一种字符的情况下。那么其他的情况下,如何讲一个回文串变成一个非回文串?我们可以先找到中间的一个字符串(如果长度是偶数,随便取左边还是右边都行),然后开始往左扫、往右扫,一旦发现有了和当前字符不一样的字符,就将这两个字符交换,不然换了之后还是回文串。

接下来讲一下,如何判断一个字符串是否是回文串?

我们定一个左边界 \(l\) 和右边界 \(r\),规定 \(l\leqslant r\)(尤其是在字符串的长度是奇数的情况下)。那么我们可以直接往中间一起扫,一旦有两个字符串不相同,那么这个字符串就不是回文串了。如果到了中间还没有不符合条件的情况出现的话,那么这个字符串就是回文串了。

至于判断一个字符串是否只有一种字符和上面的情况类似,只要发现有两个不同的字符就不可能会是的,扫完之后如果还没有出现有不同字符的情况,那么这个字符串就只有一种字符了。

Code

int t;

int main() {
getint(t);
while(t--) {
string s;
cin >> s;
int len = s.size(), flagno = 1, flagpa = 1, i, j;
_for(i, 1, len - 1) if(s[i] != s[i - 1]) flagno = 0;
for(i = 0, j = len - 1; i <= j; ++i, --j)
if(s[i] != s[j]) flagpa = 0;
if(flagno) {puts("-1"); continue;}
if(flagpa) {
int k = i;
while(s[k] == s[i] && k < len - 1) k++;
if(s[k] == s[i]) {
int k0 = i;
while(s[k0] == s[i] && k0 > 0) k0--;
swap(s[k0], s[i]);
}
else swap(s[k], s[i]);
}
cout << s << endl;
}
return 0;
}

CF1093B Letters Rearranging 题解的更多相关文章

  1. Codeforces Round 56-B. Letters Rearranging(思维)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  2. 题解合集 (update on 11.5)

    收录已发布的题解 按发布时间排序. 部分可能与我的其他文章有重复捏 qwq . AtCoder for Chinese: Link ZHOJ: Link 洛谷 \(1\sim 5\) : [题解]CF ...

  3. Educational Codeforces Round 56 (Rated for Div. 2) ABCD

    题目链接:https://codeforces.com/contest/1093 A. Dice Rolling 题意: 有一个号数为2-7的骰子,现在有一个人他想扔到几就能扔到几,现在问需要扔多少次 ...

  4. Educational Codeforces Round 56 (Rated for Div. 2)

    涨rating啦.. 不过话说为什么有这么多数据结构题啊,难道是中国人出的? A - Dice Rolling 傻逼题,可以用一个三加一堆二或者用一堆二,那就直接.. #include<cstd ...

  5. Educational Codeforces Round 56 Solution

    A. Dice Rolling 签到. #include <bits/stdc++.h> using namespace std; int t, n; int main() { scanf ...

  6. CF-1093 (2019/02/10)

    CF-1093 1093A - Dice Rolling 输出x/2即可 #include<bits/stdc++.h> using namespace std; int main() { ...

  7. 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)

    Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...

  8. Codeforces Edu Round 56 A-D

    A. Dice Rolling 把\(x\)分解为\(a * 6 + b\),其中\(a\)是满6数,\(b\)满足\(1 <= b < 6\),即可... #include <io ...

  9. LeetCode题解之 Reverse Only Letters

    1.题目描述 2.题目描述 利用栈实现逆序. 3.代码 string reverseOnlyLetters(string S) { || S.size() == ) return S; stack&l ...

随机推荐

  1. 【JavaSE】JDK配置

    Java开发环境配置 2020-09-10  08:32:20  by冲冲 1. Windows7安装JDK 1.1 下载JDK ① 下载地址:http://www.oracle.com/techne ...

  2. java8特性表达式

    public static void main(String[] args) { JFrame jframe = new JFrame("My JFrame"); JButton ...

  3. VSCode + PicGo + Github + jsDelivr 搭建稳定快速高效图床

    VSCode + PicGo + Github + jsDelivr 搭建稳定快速高效图床 目录 前言 准备 配置 验证 前言 所谓图床,就是将图片储存到第三方静态资源库中,其返回给你一个 URL 进 ...

  4. pcm-pcie 解析

    简介 pcm 全称为 Performance Counter Monitor,该项目是针对 intel 平台处理器的资源利用率进行监控的工具.在现代 Intel 处理器已经提供了监视处理器内部性能事件 ...

  5. Matlab 代码注释

    Matlab 代码注释 一直在找类似doxygen一样将程序注释发表成手册的方法,现在发现,Matlab的publish功能自己就能做到. Publish 简介 并非所有注释都能作为文本进行输出,MA ...

  6. Linux终端命令行的快捷键列表

    tab键:命令.文件名等自动补全功能. Ctrl+a:光标回到命令行首.Ctrl+e:光标回到命令行尾.Ctrl+k:删除光标处到行尾的字符.Ctrl+u:删除整个命令行文本字符.ctrl+y: 粘贴 ...

  7. perl 多fasta文件匹配,并提取匹配文件第一条序列

    目标如题,有多个fasta文件和一个文件名列表,将文件名列表中包含的文件匹配出来并提取第一条序列合并成一个fa文件. 这个采用perl实现,用法和代码如下: 1 #!/usr/bin/perl -w ...

  8. python爬虫采集

    python爬虫采集 最近有个项目需要采集一些网站网页,以前都是用php来做,但现在十分流行用python做采集,研究了一些做一下记录. 采集数据的根本是要获取一个网页的内容,再根据内容筛选出需要的数 ...

  9. mysql 分组统计、排序、取前N条记录解决方案

    需要在mysql中解决记录的分组统计.排序,并抽取前10条记录的功能.现已解决,解决方案如下: 1)表结构 CREATE TABLE `policy_keywords_rel` ( `id` int( ...

  10. c#年份筛选

    年份: <script type="text/javascript" src="http://www.shicishu.com/down/WdatePicker.j ...