社区讨论
本机正常提交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 条回复,欢迎继续交流。
正在加载回复...