题解:P1098 [NOIP2007 提高组] 字符串的展开
GLr137_2025BL · · 题解
坑较多的字符串模拟题。
其实这题只需要 ASCII 码的顺序小于或等于左边字符,那么就不会进入第二个循环。
注意点:由于这一切不分字母、数字,所以在第三个循环里有可能会遇到展开的是数字但是
# include <bits/stdc++.h>
using namespace std;
int p1, p2, p3;
string s, z = "";
int main (){
cin >> p1 >> p2 >> p3 >> s;
for (int i = 0; i < s.size(); i++){
if (s[i] == '-' && i < s.size() - 1 && i > 0 && ((s[i - 1] >= '0' && s[i - 1] <= '9' && s[i + 1] >= '0' && s[i + 1] <= '9' && s[i - 1] < s[i + 1]) || (s[i - 1] >= 'a' && s[i - 1] <= 'z' && s[i + 1] >= 'a' && s[i + 1] <= 'z' && s[i - 1] < s[i + 1]))){
for (char j = (s[i - 1 + 2 * (p3 == 2)] + 1 - 2 * (p3 == 2)); (p3 == 1 ? j <= s[i + 1] - 1 : j >= s[i - 1] + 1); (p3 == 1 ? j++ : j--)){
for (int k = 1; k <= p2; k++){
if (p1 == 1){
z += j;
}else if (p1 == 2 && j >= 'a' && j <= 'z'){
z += (j - 32);
}else if (p1 == 3){
z += '*';
}else{
z += j;
}
}
}
}else{
z += s[i];
}
}
cout << z;
return 0;
}
记录