luogu P1098 字符串的展开

算法:模拟

难度:NOIP-

题解:你只需要看明白题意就好啦!!!

 

p2=k表示同一个字符要连续填充k个

EG:

input:3 1 1
          -z-l-k-d-h

output:-z-l-k-d***h

 

//题意理解错了,debug了30min,啊啊啊

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cmath>
#include <algorithm>
#define ll long long
#define N 105
using namespace std;
string str;
char biaox[30]={0,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char biaod[30]={0,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int vis[N];
int main()
{
	int p1,p2,p3;
	scanf("%d%d%d",&p1,&p2,&p3);
	cin >> str;
	int len=str.size();
	for(int i = 0;i < len;i++)
	{
		//if(i==0&&str[i]=='-') printf("-");
		if(vis[i]) continue;
		if(str[i+1]=='-')
		{
			vis[i+1]=1;
			if(str[i+2]-str[i]==1)
			{
				cout << str[i]  ;
				i+=1;
				continue;
			}
			if(str[i]-str[i+2]>=0)
			{
				cout << str[i] <<  str[i+1] ;
				i+=1;
				continue;
			}
			if(str[i]-48>=0&&str[i]-48<=9&&str[i+2]-str[i]>0&&str[i+2]-48>=0&&str[i+2]-48<=9)//同为数字 
			{
				cout << str[i];
				if(p1==3)//星号“*”
				{
					for(int o = str[i]-48+1;o < str[i+2]-48;o++)
					{
						for(int k = 1;k <= p2;k++)
						{
							printf("*");
						}
					}
				}else
				{
					for(int o = str[i]-48+1;o < str[i+2]-48;o++)
					{
						for(int jj = 1;jj <= p2;jj++)
						{
							printf("%d",o);
						}
					}	
				}
				continue;
			}else if(str[i]-96>=1&&str[i]-96<=26&&str[i+2]-str[i]>0&&str[i+2]-96>=1&&str[i+2]-96<=26)//同为字母 
			{
				cout << str[i];
				if(p1==1)//小写字母 
				{
					if(p3==1)//正序 
					{
						for(int k = str[i]-96+1;k < str[i+2]-96;k++)
						{
							for(int jj = 1;jj <= p2;jj++)
							{
								printf("%c",biaox[k]);
							}
						}
					}else if(p3==2)//倒序 
					{
						for(int k = str[i+2]-96-1;k > str[i]-96;k--)
						{
							for(int jj = 1;jj <= p2;jj++)
							{
								printf("%c",biaox[k]);
							}
						}
					} 
				}else if(p1==2)//大写字母 
				{
					if(p3==1)//正序 
					{
						for(int k = str[i]-96+1;k < str[i+2]-96;k++)
						{
							for(int jj = 1;jj <= p2;jj++)
							{
								printf("%c",biaod[k]);
							}
						}
					}else if(p3==2)//倒序 
					{
						for(int k = str[i+2]-96-1;k > str[i]-96;k--)
						{
							for(int jj = 1;jj <= p2;jj++)
							{
								printf("%c",biaod[k]);
							}
						}
					} 
				}else if(p1==3)//星号“*”
				{
					for(int k = str[i]-96+1;k < str[i+2]-96;k++)
					{
						for(int k = 1;k <= p2;k++)
						{
							printf("*");
						}
					}
				}else cout << str[i+2];
				continue;
			}else
			{
				cout << str[i] << str[i+1];
				continue;
			}	
		}
		cout << str[i]; 
	}
	return 0 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值