社区讨论

本机正常提交RE求助

P1098[NOIP 2007 提高组] 字符串的展开参与者 3已保存回复 19

讨论操作

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

当前回复
19 条
当前快照
1 份
快照标识符
@mi85w2n7
此快照首次捕获于
2025/11/21 09:08
4 个月前
此快照最后确认于
2025/11/21 09:45
4 个月前
查看原帖
喏,这是代码:
CPP
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;

int p1,p2,p3;
string s;
void rep(int);//替换函数
int type(char);//判断字符的种类

int main()
{
	cin>>p1>>p2>>p3>>s;
	int len=s.length();
	for(int i=0;i<len;i++)
	{
		if(s[i]=='-')
			rep(i);//遇到减号就替换

		len=s.length();
	}
	
	for(int i=0;i<len;i++)
	{
		if(s[i]!='@')//输出把用来占位的@换成-
			cout<<s[i];
		else
			cout<<'-';
	}
	return 0;
}
int type(char a)
{
	if('0'<=a && a<='9')	return 1;
	if('a'<=a && a<='z')	return 2;
	return -1;
}
void rep(int n)
{
	int l=s[n-1],r=s[n+1];//左边的和右边的
	if(l>=r || type(l)!=type(r))//左大于右或种类不同
	{
		s[n]='@';//标记占位
		return;
	}
	if(p3==1)
	{
		string t="";//t用来存储要插入的字符串
		for(char c=l+1;c<r;c++)
		{
			for(int i=0;i<p2;i++)//重复p2次
			{
				if(p1==1)		t+=c,s+=' ';
				else if(p1==2)	t+=toupper(c),s+=' ';//p1=2时要大写
				else			t+='*',s+=' ';//p1=3时换成*
			}
		}
		//cout<<"t="<<t<<endl;
		int slen=s.length();
		int tlen=t.length();
		//插入
		for(int i=slen-1;i>=n-1;i--)
			s[i+tlen-1]=s[i];
		for(int i=0;i<tlen;i++)
			s[i+n]=t[i];
	}
	if(p3==2)
	{
		string t="";
		for(char c=r-1;c>l;c--)//就倒了一下
		{
			for(int i=0;i<p2;i++)
			{
				if(p1==1)		t+=c,s+=' ';
				else if(p1==2)	t+=toupper(c),s+=' ';
				else			t+='*',s+=' ';
			}
		}
		//cout<<"t="<<t<<endl;
		int slen=s.length();
		int tlen=t.length();
		
		for(int i=slen-1;i>=n-1;i--)
			s[i+tlen-1]=s[i];
		for(int i=0;i<tlen;i++)
			s[i+n]=t[i];
	}
}

回复

19 条回复,欢迎继续交流。

正在加载回复...