分析:
这道题我觉得比表达式求值还难受
直接模拟
在碰到当前位置的下一个位置是‘-’时
就要考虑展开了
不必展开的所有情况:
1.a-a —-> a-a
-号两边的符号相同
2.a-b,1-2
-号两边的符号紧邻
—-> ab
—-> 12
3.a-4,3-b
两边的符号不同类
—-> a-4
—-> 3-b
4.-号前后也是-
–9 —-> –9
展开
经过重重检验,我们就可以展开了
先按照p3分成两支
按照p1再继续细分
不要忘了判断-号前后的符号既同类又单增
最后如果-号两边的符号是递减的关系
直接复制就好: 4-0 —-> 4-0
tip
当处理完当前-号之后,指针只能向后移动两位,避免以下情况
a-b-c —-> abc
答案数组一定要开够
我在这里开了1w
这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int p1,p2,p3,l;
char s[100],ans[10000];
void doit(int bh)
{
int i,j;
bool ff=1;
if (p3==1) //正序
{
if (p1==3){ //*
if (s[bh]>='0'&&s[bh]<='9'&&s[bh+2]<='9'&&s[bh+2]>='0'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'0'+1;j<=s[bh+2]-'0'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='*';
ff=0;
}
else if (s[bh]>='a'&&s[bh]<='z'&&s[bh+2]<='z'&&s[bh+2]>='a'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'a'+1;j<=s[bh+2]-'a'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='*';
ff=0;
}
}
else{
if (s[bh]>='0'&&s[bh]<='9'&&s[bh+2]<='9'&&s[bh+2]>='0'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'0'+1;j<=s[bh+2]-'0'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='0'+j;
ff=0;
}
else
{
if (p1==1&&s[bh]>='a'&&s[bh]<='z'&&s[bh+2]<='z'&&s[bh+2]>='a'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'a'+1;j<=s[bh+2]-'a'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='a'+j;
ff=0;
}
else
if (p1==2&&s[bh]>='a'&&s[bh]<='z'&&s[bh+2]<='z'&&s[bh+2]>='a'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'a'+1;j<=s[bh+2]-'a'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='A'+j;
ff=0;
}
}
}
}
else
{
if (p1==3){ //*
if (s[bh]>='0'&&s[bh]<='9'&&s[bh+2]<='9'&&s[bh+2]>='0'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'0'+1;j<=s[bh+2]-'0'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='*';
ff=0;
}
else if (s[bh]>='a'&&s[bh]<='z'&&s[bh+2]<='z'&&s[bh+2]>='a'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh]-'a'+1;j<=s[bh+2]-'a'-1;j++)
for (i=1;i<=p2;i++)
ans[++l]='*';
ff=0;
}
}
else{
if (s[bh]>='0'&&s[bh]<='9'&&s[bh+2]<='9'&&s[bh+2]>='0'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh+2]-'0'-1;j>=s[bh]-'0'+1;j--)
for (i=1;i<=p2;i++)
ans[++l]='0'+j;
ff=0;
}
else
{
if (p1==1&&s[bh]>='a'&&s[bh]<='z'&&s[bh+2]<='z'&&s[bh+2]>='a'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh+2]-'a'-1;j>=s[bh]-'a'+1;j--)
for (i=1;i<=p2;i++)
ans[++l]='a'+j;
ff=0;
}
else
if (p1==2&&s[bh]>='a'&&s[bh]<='z'&&s[bh+2]<='z'&&s[bh+2]>='a'&&s[bh]<s[bh+2]){
ans[++l]=s[bh];
for (j=s[bh+2]-'a'-1;j>=s[bh]-'a'+1;j--)
for (i=1;i<=p2;i++)
ans[++l]='A'+j;
ff=0;
}
}
}
}
if (ff) ans[++l]=s[bh],ans[++l]=s[bh+1];
}
int main()
{
scanf("%d%d%d",&p1,&p2,&p3);
scanf("%s",&s);
int i=0,len=strlen(s);
l=-1;
while (i<len)
{
if (s[i+1]=='-') //要展开了
{
if (s[i]==s[i+2]){
ans[++l]=s[i]; ans[++l]=s[i+1]; i=i+2;
}
else if ((int)s[i]==(int)s[i+2]-1){
ans[++l]=s[i]; i=i+2;
}
else if ((s[i]>='0'&&s[i]<='9'&&s[i+2]>='a'&&s[i+2]<='z')||(s[i+2]>='0'&&s[i+2]<='9'&&s[i]>='a'&&s[i]<='z')){
ans[++l]=s[i]; ans[++l]=s[i+1]; i+=2;
}
else if (s[i]==s[i+1]){
ans[++l]=s[i]; ans[++l]=s[i+1]; i+=2;
}
else if (s[i+1]==s[i+2]){
ans[++l]=s[i]; ans[++l]=s[i+1]; ans[++l]=s[i+2]; i+=3;
}
else doit(i),i+=2;
}
else
{
ans[++l]=s[i]; i++;
}
}
printf("%s",ans);
return 0;
}