Rikka with string-------(BestCoder Round #37)

本文详细介绍了如何通过已知信息帮助萌萌哒六花复原丢失的数学练习串,包括输入描述、输出描述、分析过程及代码实现。尽管初看简单,但实际操作中隐藏了诸多陷阱,考验着编程者的细心与逻辑思维。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rikka with string

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:
有一天勇太得到了一个长度为nn的字符串,但是六花一不小心把这个字符串搞丢了。于是他们想要复原这一个字符串。勇太记得这个字符串只包含小写字母而且这个串不是回文串。然而不幸的是他已经不记得这个字符串中的一些字符了,你可以帮他复原这个字符串吗?
当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
输入描述
多组数据,数据组数不超过2020,每组数据第一行两个正整数nn。接下来一行一个长度为nn的只包含小写字母和’?’的字符串,’?’表示勇太已经忘了这一个位置的字符了。
1 \leq n \leq 10^{3}1n103
输出描述
每组数据输出仅一行一个长度为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;
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值