(加上了详细的注释) 求助!啊啊啊 全红了 本地测试和在线ide都没问题
查看原帖
(加上了详细的注释) 求助!啊啊啊 全红了 本地测试和在线ide都没问题
941753
niuge666楼主2023/11/23 08:37
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include <string>
#include<cmath>
#include<sstream>

using namespace std;

int a[4];

int main()
{
	for (int i = 1; i <= 3; i++) cin >> a[i];//三个:p1 p2 p3 挨个读入

	getchar();//由于下面有getline 所以先吃掉回车

	string s;
	getline(cin, s);

	int pos = s.find("-");//找到第一个减号
	while (pos < s.size())//如果s里面还能找到减号(退出的条件为 pos>=s.size() 即pos==string::npos)
	{
		if (s[pos + 1] > s[pos - 1])//如果减号右边的字符ascii 码大于左边的字符ascii码才动(做变换)  否则不动(不做变换)
		{
			string tmp = "";
			if (s[pos + 1] >= 'a')
			{
				for (int i = s[pos - 1] + 1; i < s[pos + 1]; i++)
				{//这里是默认左右都是字母
					for (int j = 1; j <= a[2]; j++)
					{
						if (a[1] == 1)//1对应填小写字母
						{
							tmp += (char)i;
						}
						else if (a[1] == 2)//2对应填大写字母
						{
							tmp += (char)(i - 32);
						}
						else//(3)否则的话填*
							tmp += '*';
					}
				}
			}
			else//else 表示左右两边不是字母 即数字
			{
				for (int i = s[pos - 1] + 1; i < s[pos + 1]; i++)
				{//这里是数字
					for (int j = 1; j <= a[2]; j++)
					{
						if (a[1] != 3)//同以上if  注释就不写了
							tmp += (char)(i);
						else
							tmp += '*';
					}
				}
			}

			if (a[3] == 2) reverse(tmp.begin(), tmp.end());//最后处理a[3]==2  表示反转重复加过的字母或数字

			s = s.substr(0, pos) + tmp + s.substr(pos + 1, s.size() - 1 - pos);//更新过后的字符串=原字符串截到减号之前+减号左右需要重复的+减号之后的
		}
		pos = s.find("-", pos + 1);//pos+1 接着下一轮找“-”  这里只用pos+1就行 因为找“-”是从左往右去找的 更新减号左右重复的东西也是在“-”之后更新的 所以pos之前的下标不受影响
	}
	cout << s << endl;
	//cout << "abcsttuuvvw1234556677889s-4zz";

	//cout << (s == "abcsttuuvvw1234556677889s-4zz");//测试:这里输出了1啊 明明是对的
	//cout << (s == "aCCCBBBd-d");//测试样例2:也对
	//cout << (s == "aBBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYz");//洛谷全红了  我就下载了第一个数据点 也对

	/*
	注:洛谷第一个下载的数据点为:

	样例输入:
	2 2 1
	a-z

	样例输出:
	aBBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYz
	*/
	return 0;
}
2023/11/23 08:37
加载中...