专栏文章
题解:P1098 [NOIP2007 提高组] 字符串的展开
P1098题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miqdauv9
- 此快照首次捕获于
- 2025/12/04 02:55 3 个月前
- 此快照最后确认于
- 2025/12/04 02:55 3 个月前
这道题模拟一下,两个给出的数据基本可以判断代码的正确性,但有可能是 分,原因有可能是只在循环外求了 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 条评论,欢迎与作者交流。
正在加载评论...