BestCoder37 1001.Rikka with string 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5202

题目意思:给出一个长度为 n,只有小写字母和 ? 组成的字符串。现在需要向 ? 的位置填小写字母,使得最终得到的字符串是字典序最小且不是回文串。如果怎么填都不符合结果,则输出 "QwQ"。

  首先我大体的解决思路是正确的。

  先考虑最简单的情况,有可能整个字符串都不含 “?”。那么如果它不是回文串,就符合题目条件,否则输出"QwQ"

  然后考虑有 “?” 的情况。我单纯地把除最后一个 ? 的位置以外的所有 ? 都替换成 a,然后最后一个 ? 暴力试探所有小写字母。如果找不到符合条件的就输出"QwQ"。 这种做法忽略了一种情况。如果字符串是这样 ????aaa,就会无解;但是其实是有解的,即应该输出 aabaaaa 。所以正确的做法还需要考虑倒数第二个?的位置!!!

  最后一点就是只有一个 ? 的时候,需要特判一下。

(代码有点长,但非常好理解哦~~~~~)手痒痒,又偷偷玩了下

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 using namespace std;
 6
 7 int n;
 8 const int maxn = 5000 + 5;
 9 char s[maxn];
10
11 bool check(char s[])
12 {
13     bool flag = true;
14     for (int i = 0; i < n/2; i++) {
15         if (s[i] != s[n-i-1]) {
16             flag = false;
17             break;
18         }
19     }
20     return flag;
21 }
22
23 int main()
24 {
25     #ifndef ONLINE_JUDGE
26         freopen("in.txt", "r", stdin);
27     #endif // ONLINE_JUDGE
28
29     while (scanf("%d", &n) != EOF) {
30         scanf("%s", s);
31         int l = -1;   // 初始不能为0,因为可能第一个位置是 ?
32         // 有问号代表可能有解
33         for (int i = 0; i < n; i++) {
34             if (s[i] == ‘?‘) {
35                 l = i;  // 找出最右边第一次出现的问号
36             }
37         }
38         // 没有问号的情况
39         if (l == -1) {
40             printf("%s\n", check(s) ? "QwQ" : s);
41         }
42         // 有问号
43         else {
44             // 记下倒数第二个 ? 的位置
45             int pos = -1;
46             // 除了最后的问号,其他问号都填 a
47             for (int i = 0; i < l; i++) {
48                 if (s[i] == ‘?‘) {
49                     pos = i;
50                     s[i] = ‘a‘;
51                 }
52             }
53             bool flag = false;
54             for (int i = 0; i <= 25; i++) {
55                 // 最后的问号填数,使得不是回文串
56                 s[l] = i + ‘a‘;
57                 if (!check(s)) {
58                     printf("%s\n", s);
59                     flag = true;
60                     break;
61                 }
62             }
63             // 倒数第二个问号的位置不填 a
64             if (!flag) {
65                 if (pos == -1) // 排除只有一个问号的情况,? 可能在正中间
66                     printf("QwQ\n");
67                 else {
68                     s[l] = ‘a‘;
69                     s[pos] = ‘b‘;
70                     printf("%s\n", check(s)? "QwQ" : s);
71                 }
72             }
73         } // end else
74     }
75     return 0;
76 }
时间: 2024-09-25 01:50:51

BestCoder37 1001.Rikka with string 解题报告的相关文章

Leetcode:Interleaving String 解题报告

Interleaving StringGiven s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = "aabcc",s2 = "dbbca", When s3 = "aadbbcbcac", return true.When s3 = "aadbbbaccc", return false.

Leetcode:Scramble String 解题报告

Scramble String Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively. Below is one possible representation of s1 = "great": great / gr eat / \ / g r e at / a t To scramble the string,

【LeetCode】Interleaving String 解题报告

[题目] Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given: s1 = "aabcc", s2 = "dbbca", When s3 = "aadbbcbcac", return true. When s3 = "aadbbbaccc", return false. [解析] 题意:有

Leetcode 151. Reverse Words in a String 解题报告

[Problem] Given an input string, reverse the string word by word. For example,Given s = "the sky is blue",return "blue is sky the". Update (2015-02-12):For C programmers: Try to solve it in-place in O(1) space. [Idea] 从左往右遍历一次,每当遇到空格暂停

BestCoder8 1001.Summary(hdu 4989) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4989 题目意思:给出 n 个数,然后将这些数两两相加,得到 n*(n-1) /2 对和,把重复的和去掉,最后相加起来. 用STL中的set可以好方便的做出来,因为 insert 的时候它会自动去除重复的.记得要用 long long 或 int64,因为 -1000000000 <= ai <= 1000000000 ! 1 #include <iostream> 2 #include

BestCoder17 1001.Chessboard(hdu 5100) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目意思:有一个 n * n 的棋盘,需要用 k * 1 的瓷砖去覆盖,问最大覆盖面积是多少. 比赛时不会做............. hdu 题解: 首先,若n<k,则棋盘连一个1×k的矩形都放不下,输出0. 我们只需要考虑n≥k的情况.将棋盘类似于黑白染色,按(i+j)模k划分等价类,给每个格子标一个号. 标号之后,会注意到每条从左下到右上的斜线数字都是相同的,那么对于s×s的格子,其内部

【弱省胡策】Round #6 String 解题报告

感觉这个题好神啊. 首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串. 具体就是把串先倍长,然后倒过来,然后求 $Next$ 数组,然后从 $2n$ 开始沿着 $Next[]$ 跳,直到跳到 $\le n$ 的时候停止,看哪些位置被跳到了,哪些位置就是合法的. 问题是现在 $a \neq b$ 怎么办..? 我猜啊,我们可以求出限制是 $a$ 的倍数时,哪些 B 串是合法的,再求出限制是 $b$ 的倍数是,哪些是合法的

Valentine&#39;s Day Round 1001.Ferries Wheel(hdu 5174)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1]<A[i]<A[i+1](1<i<K).现在要求的是,有多少人满足,(他坐的缆车的值 + 他左边缆车的值) % INT_MAX == 他右边缆车的值. 首先好感谢出题者的样例三,否则真的会坑下不少人.即同一部缆车可以坐多个人.由于缆车的值是唯一的,所以可以通过排序先排出缆车的位置.求出

POJ 1001 解题报告 高精度大整数乘法模版

题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于错误的判断还不够严厉. 对边界情况的讨论其实应该是思维严密的表现,当然这并不能表明我写的一点错误都没有,只是多多分析一下还是很有好处的. #include <iostream> #include <fstream> #include <string> #include &l