P1098 [NOIP2007 提高组] 字符串的展开 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
该题许多细节需要注意
具体代码解析如下:
#include<iostream>
#include<cstring>
using namespace std;
char arr[1100];
int p1, p2, p3;
void print(int l,int r)//l代表'-'左边的 r代表'-'右边的
{
if (arr[l] == arr[r]-1) return;//若是a-b之类的 '-'不输出
if (p3 == 1) //顺序
{
//cout<<"get"<<endl;
for (char i = arr[l]+1; i < arr[r]; i++ )
for (int j = 0; j < p2; j++)
{
if (p1 != 3)
{ //只需要考虑p1=2的情况 因为题目说了'-'两边为小写字母才需要展开故大写字母无需考虑
if ( (p1 == 2) && (arr[l] >= 'a' && arr[l] <= 'z') )
cout << char(i-32);//p1=2且'-'两边为小写
else cout << char(i);
}
else cout << "*"; //p1=3输出等量'*'
}
}
else if (p3 == 2) //逆序
{
for (char i = arr[r]-1; i >= arr[l]+1; i-- )
for (int j = 0; j < p2; j++)
if (p1 != 3)
{
if ( (p1 == 2) && (arr[l] >= 'a' && arr[l] <= 'z') )
cout << char(i-32);//p1=2且'-'两边为小写
else cout << char(i);
}
else cout << "*"; //p1=3输出等量'*'
}
}
int main()
{
cin >> p1 >> p2 >> p3;
cin >> arr;
for (int i = 0; i < strlen(arr); i++)
{
if ((arr[i] != '-') || (i == 0) || (i == strlen(arr)-1)) //'-'在第一个或最后一个都不合法
{
cout << arr[i];
continue;
}
if (arr[i-1] >= arr[i+1])//减号两侧按照 ASCII 码的顺序,减号右边的字符严格大于左边的字符
{
cout << arr[i];
continue;
}
//减号两侧同为小写字母或同为数字
if ( ((arr[i-1]>='0' && arr[i-1]<='9') && (arr[i+1]>='0' && arr[i+1]<='9')) || ((arr[i-1]>='a' && arr[i-1]<='z') && (arr[i+1]>='a' && arr[i+1]<='z')) )
{
print(i-1, i+1);
}
else cout << arr[i];
}
return 0;
}