String Successor zoj 3490

时间:2023-03-10 02:50:44
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;
}