洛谷 P1098 [NOIP2007 提高组] 字符串的展开

P1098 NOIP2007 提高组 字符串的展开

菜鸟生成记(40)

又是一道模拟水题,没啥难度,就是看你"细不细",粗心到处是坑,心细的话一遍过;(我嘛!把坑踩完,才过了T-T)

#include<iostream>
#include<vector>
using namespace std;
vector<string> str;//定义一个容器,每个单位都可以储存一个string串 
vector<string>::iterator ita;//vector<string>型的迭代器(相当于C语言中的指针),只能ita++,ita-- ,不能跳摇(ita+=3) 
int a,b,c,num=0,len=0;
string s;
//a 1:小写,2:大写 3:星号代替
//c 1:顺序  2:逆序 
void fun()
{
	int n=0;
	string x;
	switch(a)
	{
		case 1://小写 
			switch(c)
			{
				case 1://小写顺序 
						x.clear();//清空string串,防止干扰后面的操作 
						for(char i=s[num-1]+1;i<=s[num+1]-1;i++)
						{
							for(int j=0;j<b;j++)
							{
								x.push_back(i);//字符从尾部进入x串 
							}	
						}
						str.push_back(x);//x串从尾部进入str容器 
				break;
				case 2://小写逆序 
						x.clear();//清空string串,防止干扰后面的操作 
						for(char i=s[num+1]-1;i>=s[num-1]+1;i--)
						{
							for(int j=0;j<b;j++)
							{
								x.push_back(i);//字符从尾部进入x串 
							}
						}
						str.push_back(x);//x串从尾部进入str容器 
				break;	
			}
		break;
		case 2://大写 
			switch(c)
			{
				case 1://大写顺序
						x.clear(); //清空string串,防止干扰后面的操作 
						for(char i=s[num-1]+1;i<=s[num+1]-1;i++)
						{
							for(int j=0;j<b;j++)
							{
								if(islower(s[num-1]))//字母 
								{
									char s1=i-32;
									x.push_back(s1);//字符从尾部进入x串 
								}
								else//数字不区分大小写 
								{
									x.push_back(i);//字符从尾部进入x串 
								}
							}
						}
						str.push_back(x);//x串从尾部进入str容器 
				break;
				case 2://大写逆序 
						x.clear();//清空string串,防止干扰后面的操作 
						for(char i=s[num+1]-1;i>=s[num-1]+1;i--)
						{
							for(int j=0;j<b;j++)
							{
								if(islower(s[num-1]))//字母 
								{
									char s1=i-32;
									x.push_back(s1);//字符从尾部进入x串 
								}
								else//数字不区分大小写  
								{
									x.push_back(i);//字符从尾部进入x串 
								}
							}
						}
						str.push_back(x);//x串从尾部进入str容器 
				break;	
			}
		break;
		case 3:
			//星号不分顺逆 
			x.clear();//清空string串,防止干扰后面的操作 
			for(char i=s[num-1]+1;i<=s[num+1]-1;i++)
			{
				for(int j=0;j<b;j++)
				{
					x.push_back('*');//字符从尾部进入x串 
				}
			}
			str.push_back(x);//x串从尾部进入str容器 
		break;	
	}
}
int main()
{//islower():判断是否为小写字母 
// isdigit():判断是否是数字字符 
	cin>>a>>b>>c;
	cin>>s;
	while((num=s.find('-',num))!=-1)//s.find(ch,start):在s串start位置开始查找ch,查找成功返回下标,失败返回-1 
	{//循环查找所有'-'的位置 
		if(num==0)//过特例用的('-'在第一个位置时) 
		num++;
		else
		{
			if(islower(s[num-1])&&islower(s[num+1])||isdigit(s[num-1])&&isdigit(s[num+1]))
			{
				if(s[num-1]<s[num+1])
				{
					if(s[num+1]-s[num-1]==1)
					{
						s.erase(num,1);//删除减号 
					}
					else
					fun();//调用函数,记录展开串(容器str储存每个'-'的展开串) 
				}
			else;
			}	
		num++;
		}
	}
	ita=str.begin();//迭代器赋值,指向容器str的首地址 
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='-')//检索到'-'输出特殊条件处理 
		{	
			if(i==0||i==s.size()-1)//头部和尾部的'-'直接输出 
			{
				cout<<'-';
				continue;
			}
			if(s[i+1]=='-'||s[i-1]=='-')//两个'-'相邻的直接输出 
			{
				cout<<'-';
				continue;
			}
			if(s[i-1]>=s[i+1])//'-'前的字符ASCII码>='-'后的字符,直接输出 
			{
				cout<<'-';
				continue;
			}
			if(islower(s[i-1])&&isdigit(s[i+1]))//以下两种'-'前后字符不是同类(一个字母,一个数字) 
			{
				cout<<'-';
				continue;
			}
			if(islower(s[i+1])&&isdigit(s[i-1]))
			{
				cout<<'-';
				continue;
			}
			cout<<*ita++;//不满足上面的任一情况,则输出展开串 
		}
		else//非'-'字符直接输出 
		cout<<s[i];
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值