您的位置:首页 > 其它

【CUGBACM15级BC第37场 A】hdu 5202 Rikka with string

2017-09-14 21:23 477 查看

Rikka with string

[align=center]Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1577    Accepted Submission(s): 587
[/align]

[align=left]Problem Description[/align]

As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

One day, Yuta got a string which contains n letters but Rikka lost it in accident. Now they want to recover the string. Yuta remembers that the string only contains lowercase letters and it is not a palindrome string. Unfortunately he cannot remember
some letters. Can you help him recover the string?

It is too difficult for Rikka. Can you help her?
 

[align=left]Input[/align]

This problem has multi test cases (no more than20
). For each test case, The first line contains a number
n
(1≤n≤1000).
The next line contains an n-length string which only contains lowercase letters and ‘?’ – the place which Yuta is not sure.
 

[align=left]Output[/align]

For each test cases print a n-length string – the string you come up with. In the case where more than one string exists, print the lexicographically first one. In the case where no such string exists,
output “QwQ”.
 

[align=left]Sample Input[/align]

5
a?bb?
3
aaa

 

[align=left]Sample Output[/align]

aabba
QwQ

 
题目大意:给出一个字符串,字符串中有n个问号,要求你用小写字母填充哪些问号,使得填充完后,字符串的字典序最小且不形成回文,如果无论怎么填充都是回文的话,就输出QwQ

题目大意:处理的话,先将所有问号用填充,然后再考虑是否回文,如果是回文的话,优先修改的应该是最后一个填充位置的字符,如果还是回文的话,就只需修改倒数第二个填充位置的字符,最后一个不变。因为问号大于等于2的话,那么这个字符串必定不会回文了,这里几个陷阱样例

1 ?,输出应该是QwQ

5 aa?aa,输出应该是QwQ

5 a??aa,输出abaaa

注意一下特殊情况,即最后一个问号在中间的情况

#include<cstdio>
#include<cstring>
#define maxn 1010

int n;
char str1[maxn], str2[maxn];
int mark[maxn];
bool check(char *s)
{
for (int i = 0; i < n / 2; i++)
if (s[i] != s[n - 1 - i])
{
return false;
}
return true;
}
int main()
{
while (scanf("%d", &n) == 1)
{
scanf("%s", str1);
int cnt = 0;
for (int i = 0; i < n; i++)
{
str2[i] = str1[i];
if (str1[i] == '?')
{
str2[i] = 'a';
mark[cnt++] = i;
}
}
str2
= '\0';

if (n == 1 && str1[0] == '?')
{
printf("QwQ\n");
continue;
}
if (cnt == 0 && check(str1))
{
printf("QwQ\n") ;
continue;
}
if (!check(str2))
{
printf("%s\n", str2);
continue;
}
str2[mark[cnt - 1]] = 'b';
if (!check(str2))
{
printf("%s\n", str2);
continue;
}
if (cnt == 1)
{
printf("QwQ\n");
continue;
}

str2[mark[cnt - 2]] = 'b';
str2[mark[cnt - 1]] = 'a';
printf("%s\n", str2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu