题目链接
分析
这题分为几个函数实现:判断是否展开、输出 m m m 次某个字符、循环展开。
坑点
- 有可能会有几个
-
号连续出现。 - 转换大小写时,必须先判断其是否为大小写,如果不是才转换。
-
号两端如果相等也不行。
代码
#include <bits/stdc++.h>using namespace std;int n, m, f, l;
string a;bool check(int k) {if (a[k] != '-') {return 0;} if(k <= 1 || k >= l) {return 0;} if (a[k - 1] >= a[k + 1]) {return 0;} if (k == a[k + 1] == '-' || a[k - 1] == '-') {return false;} if (isdigit(a[k - 1])) {if (!isdigit(a[k + 1])) {return 0;}} else if (isdigit(a[k + 1])) {if (!isdigit(a[k - 1])) {return 0;}}return 1;
}
void print(char c){for (int i = 1; i <= m; i ++) {cout << c;}
}
void work(char c){if (n == 3) {print('*');} else if (n == 2) {if (isdigit(c)) {print(c);} else {if (isupper(c)) {print(c);} else {print(c - 'a' + 'A');}}} else {if (isdigit(c)) {print(c);} else {if (islower(c)) {print(c);} else {print(c - 'A' + 'a');}}}
}
void fill(int k){if (f == 1) {for (char c = a[k - 1] + 1; c < a[k + 1]; c ++) {work(c);}}else {for(char c = a[k + 1] - 1; c > a[k - 1]; c --) {work(c);}}
}int main(){cin >> n >> m >> f >> a;l = a.size();a = " " + a;for (int i = 1; i <= l; i ++) {if (check(i)) {fill(i);}else {cout << a[i];}}return 0;
}