Rikka with string
Accepts: 395 Submissions: 2281
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
问题描述
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:
有一天勇太得到了一个长度为n的字符串,但是六花一不小心把这个字符串搞丢了。于是他们想要复原这一个字符串。勇太记得这个字符串只包含小写字母而且这个串不是回文串。然而不幸的是他已经不记得这个字符串中的一些字符了,你可以帮他复原这个字符串吗?
当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
输入描述
多组数据,数据组数不超过20,每组数据第一行两个正整数n。接下来一行一个长度为n的只包含小写字母和’?’的字符串,’?’表示勇太已经忘了这一个位置的字符了。
1≤n≤103
输出描述
每组数据输出仅一行一个长度为n的仅包含小写字母的字符串,如果有多种合法解,请输出字典序最小的,如果无解,请输出”QwQ”
输入样例
5
a?bb?
3
aaa
输出样例
aabba
QwQ
贪心的一直填a,知道最后一个”?”判断一下。
但是要注意如果最后一个”?”在字符串的中间,最后一个填什么都改变不了他是回文串的现实,所以要特殊处理一下。
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
int n;
char s[1005];
int Judge()
{
for (int i=1;i<=n;i++)
{
if (s[i]!=s[n-i+1]) return 0;
}
return 1;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
scanf("%s",s+1);
int l=0;
for (int i=1;i<=n;i++)
if (s[i]=='?') l=i;
if (!l&&Judge()) printf("QwQ\n");
else
{
if ((n%2)&&l==(1+n)/2)
{
int p=0;
for (int i=1;i<l;i++)
if (s[i]=='?') p=i;
if (!p&&Judge()) printf("QwQ\n");
else
{
for (int i=1;i<=n;i++)
if (s[i]=='?') s[i]='a';
if (Judge())
s[p]='b';
for (int i=1;i<=n;i++)
printf("%c",s[i]);
printf("\n");
}
}
else
{
for (int