专栏文章

题解:P1098 [NOIP2007 提高组] 字符串的展开

P1098题解参与者 3已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miqdauv9
此快照首次捕获于
2025/12/04 02:55
3 个月前
此快照最后确认于
2025/12/04 02:55
3 个月前
查看原文
这道题模拟一下,两个给出的数据基本可以判断代码的正确性,但有可能是 6060 分,原因有可能是只在循环外求了 string 类的长度。
这道题的判断条件比较多,如果用 if...else 写的话代码会比较长,但是比较容易理解。
根据题目意思写就行,用到了 string 类的一些用法,可以上官网查,当然也可以用字符数组。

AC Code

CPP
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	cin>>s;
	int len=s.size();
	for (int i=0; i<len; i++)
	{
		len=s.size();//注意更新!!!
		if (i!=0 && i!=len-1 && s[i]=='-')//判断"-",边界
			if (s[i-1]>='0' && s[i-1]<='9' && s[i+1]>='0' && s[i+1]<='9' && s[i+1]>s[i-1])
			{
				int x=i,l=int(s[i-1])+1,r=int(s[i+1]);
				s.erase(i, 1);//擦去"-"
				if (p1==3)
					for (int j=l; j<r; j++)//正序(与赋值的对应)
						for (int g=0; g<p2; g++)
						{
							s.insert(x,"*");
							x++;//更新添加位置
						}
				else if (p1==1 || p1==2)
					if (p3==1)
						for (int j=l; j<r; j++)
							for (int g=0; g<p2; g++)
							{
								s.insert(x,1,char(j));
								x++;
							}
					else if (p3==2)
						for (int j=r-1; j>=l; j--)//逆序(与赋值的对应)
							for (int g=0; g<p2; g++)
							{
								s.insert(x,1,char(j));
								x++;
							}
			}
			else if (s[i-1]>='a' && s[i-1]<='z' && s[i+1]>='a' && s[i+1]<='z' && s[i+1]>s[i-1])
			{
				int x=i,l=int(s[i-1])+1,r=int(s[i+1]);
				s.erase(i, 1);
				if (p1==3)
					for (int j=l; j<r; j++)
						for (int g=0; g<p2; g++)
						{
							s.insert(x,"*");//添加字符数组类const char*
							x++;
						}
				else if (p1==1)
				{
					if (p3==1)
						for (int j=l; j<r; j++)
							for (int g=0; g<p2; g++)
							{
								s.insert(x,1,char(j));//添加单个字符char
								x++;
							}
					else if (p3==2)
						for (int j=r-1; j>=l; j--)
							for (int g=0; g<p2; g++)
							{
								s.insert(x,1,char(j));
								x++;
							}
				}
				else if (p1==2)
					if (p3==1)
						for (int j=l; j<r; j++)
							for (int g=0; g<p2; g++)
							{
								s.insert(x,1,char(j-int('a')+int('A')));
								x++;
							}
					else if (p3==2)
						for (int j=r-1; j>=l; j--)
							for (int g=0; g<p2; g++)
							{
								s.insert(x,1,char(j-int('a')+int('A')));//变成大写
								x++;
							}
			}
	}
	cout<<s;
	return 0;
}

End

评论

2 条评论,欢迎与作者交流。

正在加载评论...