String Successor zoj 3490

链接

[https://vjudge.net/contest/294259#problem/D]

题意

就是给你一个字符串,要进行n次操作
让你输出每次的字符串
操作规则:
1.如果有数字或者字母就忽略其他的字符
否则最后面的字符就加一
2.如果存在进位,就往离当前最近的数字或者字母进位
z-a, Z-A, 9-0
如果不存在数字或者字母就在当前位置前面增加进位

分析

就是上面的规则模拟。我真的怕这种模拟。
有点麻烦。关键就是进位的情况判断就好了
然后他有可能一次操作连续进位几次,就递归一直到不能进位为止
我分析的复杂度没有问题,提交一直TLE,第二天弄个好久才发现换行因为是cout<<endl
如果我改成cout<<"\n"就过了。气屎我了,下次一定要慎用cin,cout
记住了

代码

#include<bits/stdc++.h>
using namespace std;
void go(string &s,int cur){
    if(isalnum(s[cur])){
        if(s[cur]=='Z'||s[cur]=='z'||s[cur]=='9'){
            int j=cur-1;
            while(j>=0&&!isalnum(s[j]))
            j--;
            if(j<0){
                if(s[cur]=='z') s[cur]='a',s.insert(cur,"a");
                else if(s[cur]=='Z') s[cur]='A',s.insert(cur,"A");
                else if(s[cur]=='9') s[cur]='0',s.insert(cur,"1");
            }
            else {
                 if(s[cur]=='z') s[cur]='a';
                 else if(s[cur]=='Z') s[cur]='A';
                 else if(s[cur]=='9') s[cur]='0';
                 go(s,j);
            }
        }
        else {
            s[cur]++; return;
        }
    }
    else{
        s[cur]++; return;
    }
}
int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int t,n; string s;
    cin>>t;
    while(t--){
        cin>>s>>n;
        for(int i=0;i<n;i++){
            int cur=-1;
            for(int k=s.length()-1;k>=0;k--)
            if(isalnum(s[k])){
                cur=k; break;
            }
            if(cur==-1) cur=s.length()-1;
            go(s,cur);
            cout<<s<<"\n";  
        }
        cout<<"\n";
    }
    return 0;
}

转载于:https://www.cnblogs.com/mch5201314/p/10689243.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值