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;
}
posted @ 2019-04-11 13:57  ChunhaoMo  阅读(116)  评论(0编辑  收藏  举报