Rikka with string
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
分析:读完题后,感觉还是挺好做的,然而提交总是WA。这道题坑有点多,我看了题解才恍然大悟,ORZ。
CODE:
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
char c[1005];
for(int i=0;i<n;i++)
cin>>c[i];
if(n==1){
cout<<"QwQ"<<endl;
continue;
}
int ans[1005]={-1};
int cnt=0;
for(int i=0;i<n;i++){
if(c[i]=='?'){
c[i]='a';
ans[cnt]=i;
cnt++;
}
}
bool flag =true;
for(int i=0,j=n-1;i<n,j>=0;i++,j--){
if(c[i]!=c[j]){
for(int i=0;i<n;i++)
cout<<c[i];
cout<<endl;
flag=false;
break;
}
}
if(flag&&cnt==0){
cout<<"QwQ"<<endl;
continue;
}
else if(flag&&cnt==1&&n&1&&ans[cnt-1]==n/2){
cout<<"QwQ"<<endl;
continue;
}
else if(flag&&cnt!=1&&n&1&&ans[cnt-1]==n/2){
c[ans[cnt-2]]='b';
for(int i=0;i<n;i++)
cout<<c[i];
cout<<endl;
continue;
}
else if(flag&&ans[0]!=-1){
c[ans[cnt-1]]='b';
for(int i=0;i<n;i++)
cout<<c[i];
cout<<endl;
}
}
}