BestCoder37 1001.Rikka with string 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5202
题目意思:给出一个长度为 n,只有小写字母和 ? 组成的字符串。现在需要向 ? 的位置填小写字母,使得最终得到的字符串是字典序最小且不是回文串。如果怎么填都不符合结果,则输出 "QwQ"。
首先我大体的解决思路是正确的。
先考虑最简单的情况,有可能整个字符串都不含 “?”。那么如果它不是回文串,就符合题目条件,否则输出"QwQ"
然后考虑有 “?” 的情况。我单纯地把除最后一个 ? 的位置以外的所有 ? 都替换成 a,然后最后一个 ? 暴力试探所有小写字母。如果找不到符合条件的就输出"QwQ"。 这种做法忽略了一种情况。如果字符串是这样 ????aaa,就会无解;但是其实是有解的,即应该输出 aabaaaa 。所以正确的做法还需要考虑倒数第二个?的位置!!!
最后一点就是只有一个 ? 的时候,需要特判一下。
(代码有点长,但非常好理解哦~~~~~)手痒痒,又偷偷玩了下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std; int n;
const int maxn = + ;
char s[maxn]; bool check(char s[])
{
bool flag = true;
for (int i = ; i < n/; i++) {
if (s[i] != s[n-i-]) {
flag = false;
break;
}
}
return flag;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE while (scanf("%d", &n) != EOF) {
scanf("%s", s);
int l = -; // 初始不能为0,因为可能第一个位置是 ?
// 有问号代表可能有解
for (int i = ; i < n; i++) {
if (s[i] == '?') {
l = i; // 找出最右边第一次出现的问号
}
}
// 没有问号的情况
if (l == -) {
printf("%s\n", check(s) ? "QwQ" : s);
}
// 有问号
else {
// 记下倒数第二个 ? 的位置
int pos = -;
// 除了最后的问号,其他问号都填 a
for (int i = ; i < l; i++) {
if (s[i] == '?') {
pos = i;
s[i] = 'a';
}
}
bool flag = false;
for (int i = ; i <= ; i++) {
// 最后的问号填数,使得不是回文串
s[l] = i + 'a';
if (!check(s)) {
printf("%s\n", s);
flag = true;
break;
}
}
// 倒数第二个问号的位置不填 a
if (!flag) {
if (pos == -) // 排除只有一个问号的情况,? 可能在正中间
printf("QwQ\n");
else {
s[l] = 'a';
s[pos] = 'b';
printf("%s\n", check(s)? "QwQ" : s);
}
}
} // end else
}
return ;
}
BestCoder37 1001.Rikka with string 解题报告的更多相关文章
- 【LeetCode】481. Magical String 解题报告(Python)
[LeetCode]481. Magical String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:/ ...
- 【LeetCode】833. Find And Replace in String 解题报告(Python)
[LeetCode]833. Find And Replace in String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu ...
- 【LeetCode】678. Valid Parenthesis String 解题报告(Python)
[LeetCode]678. Valid Parenthesis String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人 ...
- 【LeetCode】536. Construct Binary Tree from String 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 统计字符串出现的次数 日期 题目地址:https:// ...
- 【LeetCode】1065. Index Pairs of a String 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- 【LeetCode】345. Reverse Vowels of a String 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用栈 双指针 日期 [LeetCode] 题目地址 ...
- 【LeetCode】758. Bold Words in String 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- 【LeetCode】616. Add Bold Tag in String 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- 【LeetCode】1119. Remove Vowels from a String 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 判断字符是否是aeiou 日期 题目地址:https: ...
随机推荐
- CF460C Present (二分 + 差分数列)
Codeforces Round #262 (Div. 2) C C - Present C. Present time limit per test 2 seconds memory limit p ...
- [译]Mongoose指南 - Connection
使用mongoose.connect()方法创建连接 mongoose.conect('mongodb://localhost/myapp'); 上面的代码是通过默认端口27017链接到mongodb ...
- EF方便的添加一条信息...
//刚开始通过EF添加数据都是这样的...↓ var db = new DBEntities() T_User t_userinfo = new T_User() { Type = "typ ...
- EF更新指定字段...
EF更新指定的字段... 搜来搜去发现没有自己想要的啊... 或许本来就有更好的办法来实现我这个,所以没有人来搞吧... 如果有,请不吝告知..GG.. //要更改UserInfo表中指定的列,比如这 ...
- WP8.1下 Cortana语音命令 VCD文件 设计
Windows Phone8.1下的Cortana,可以通过语音的方式,打开.设置应用,进行页面跳转.执行任务. 我们先要创建VCD(VoiceCommand.xml)文件 <?xml vers ...
- POJ 1019 Number Sequence
找规律,先找属于第几个循环,再找属于第几个数的第几位...... Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- linux远程复制和压缩文件的命令
1.linux导出指定数据库表 mysqldump 127.0.0.1 -uname -ppwd databasename tablename>/home/name/tablename. ...
- 教你如何删除tomcat服务器的stdout.log文件
用Tomcat做WEB服务器的人都知道,有个很让人头痛的问题,就是stdout.log日志文件会自动增长,而且增长得很快. 先来看看我的痛处吧,公司有个WEB应用,就是用Tomcat作为服务器的,由于 ...
- C语言 homework(4)
#include <stdio.h> int main(){ ; i=; ) { sum+=i; i++; } printf("sum=%d\n",sum); ; } ...
- Graphic32中TBitmap32.TextOut性能分析[转载]
转载:http://blog.csdn.net/avan_lau/article/details/6958497 最近在分析软件中画线效率问题,发现在画一些标志性符号的方法,存在瓶颈,占用较大的时间. ...