一道模拟题,来模拟进位
暴力的从右往左扫描,按规则求后继就好了。除了Sample已给出的,还有一些需要注意的地方:
- 9的后继是10,而不是00;
- (z)的后继是(aa),而不是a(a);
- 输入虽然最长只有100,但输出最长可能有102。
事实上题目中给的字符串后继规则,也是Ruby中String#succ或String#next所用的规则
http://blog.watashi.ws/1944/the-8th-zjpcpc/
标程也写的非常好
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream> #include <cstring> #include <cmath> #include <stack> #include <string> #include <map> #include <set> #include <list> #include <queue> #include <vector> #include <algorithm> #define Max(a,b) (((a) > (b)) ? (a) : (b)) #define Min(a,b) (((a) < (b)) ? (a) : (b)) #define Abs(x) (((x) > 0) ? (x) : (-(x))) #define MOD 1000000007 #define pi acos(-1.0) using namespace std; typedef long long ll ; typedef unsigned long long ull ; typedef unsigned int uint ; typedef unsigned char uchar ; template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;} template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;} const double eps = 1e-7 ; const int N = 210 ; const int M = 1100011*2 ; const ll P = 10000000097ll ; const int MAXN = 10900000 ; string str; int n; bool exist () { for (int i = 0; i < str.size(); ++i) { if (str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z' || str[i] >='0' && str[i] <= '9') return true; } return false; } bool exist (char ch) { return ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <='9'; } int main(){ std::ios::sync_with_stdio(false); int i, j, t, k, u, v, numCase = 0; int flag; cin >> t; while (t--) { cin >> str >> n; while (n--) { if (exist ()) { flag = 0; for (i = str.size () - 1; i >= 0; --i) { if (exist (str[i])) { if (str[i] == '9' || str[i] == 'Z' || str[i] == 'z') { for (j = 0; j < i; ++j) { if (exist (str[j])) break; } if (j == i && j != 0) { if (str[i] == '9') { flag = 1; str[i] = '0'; } else if (str[i] == 'Z') { flag = 2; str[i] = 'A'; } else if (str[i] == 'z') { flag = 3; str[i] = 'a'; } if (flag) { if (1 == flag) { string tmp; for (k = 0; k < i; ++k) tmp.push_back(str[k]); tmp.push_back('1'); for (k = i; k < str.size(); ++k) tmp.push_back(str[k]); str = tmp; } if (2 == flag) { string tmp; for (k = 0; k < i; ++k) tmp.push_back(str[k]); tmp.push_back('A'); for (k = i; k < str.size(); ++k) tmp.push_back(str[k]); str = tmp; } if (3 == flag) { string tmp; for (k = 0; k < i; ++k) tmp.push_back(str[k]); tmp.push_back('a'); for (k = i; k < str.size(); ++k) tmp.push_back(str[k]); str = tmp; } } flag = 0; break; } else { if (str[i] == '9') { flag = 1; str[i] = '0'; } else if (str[i] == 'Z') { flag = 2; str[i] = 'A'; } else if (str[i] == 'z') { flag = 3; str[i] = 'a'; } } } else { flag = 0; ++str[i]; break; } } } if (flag) { if (1 == flag) { string tmp; tmp.push_back('1'); for (i = 0; i < str.size(); ++i) tmp.push_back(str[i]); str = tmp; } if (2 == flag) { string tmp; tmp.push_back('A'); for (i = 0; i < str.size(); ++i) tmp.push_back(str[i]); str = tmp; } if (3 == flag) { string tmp; tmp.push_back('a'); for (i = 0; i < str.size(); ++i) tmp.push_back(str[i]); str = tmp; } } cout << str << endl; } else { ++str[str.size () - 1]; cout << str << endl; } } cout << endl; } return 0; }