1052 卖个萌 (20 分)

1052 卖个萌 (20 分)

萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:[左手]([左眼][口][右眼])[右手]
现给出可选用的符号集合,请你按用户的要求输出表情。

输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []内。题目保证每个集合都至少有一个符号,并不超过 10 个符号;每个符号包含 1 到 4 个非空字符。

之后一行给出一个正整数 K,为用户请求的个数。随后 K 行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从 1 开始),数字间以空格分隔。

输出格式:
对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出 Are you kidding me? @/@。

输入样例:

[╮][╭][o][~\][/~]  [<][>]
[╯][╰][^][-][=][>][<][@][⊙]
[Д][▽][_][ε][^]  ...
4
1 1 2 2 2
6 8 1 5 5
3 3 4 3 3
2 10 3 9 3

输出样例:

╮(╯▽╰)╭
<(@Д=)/~
o(^ε^)o
Are you kidding me? @\/@

这个题莫名其妙竟然卡了很久。主要时没想到怎么简单的处理。期间用了char类型的操作来处理,然后发现太复杂,堆栈溢出,怎么调都不对,然后无奈了。。。
后来发现用string的操作就能实现。思路很简单:

  1. 先用getline把手眼鼻三行分别读入,然后cin一个行号的计数;
  2. 分别对每行的string进行处理,遍历各个string中的元素,记录下每个部位在string中的起始位置和各自长度(注意有些特殊字符不属于ASCII,是要占用多个字节的。把起始位置和长度存到数组中(如a和aa)。遍历遇到中括号的时候顺便记录一下每个字符串中有多少个部位。
  3. 循环读入5个部位编号,然后判断一下是否长度越界,然后就输出表情即可
  4. 输出表情的注意:
    1. 在手和眼睛的中间有小括号要自动添加。
    2. 在判断若用户选择的序号是否存在时,注意不光要判断上界是否溢出,还有下界,比如负号情况,在oj判断中也存在。因为这个点,W了半天也没找到原因,要引以为戒。
  5. 字符串处理输出的时候用了<string>str.substr(起点,长度)操作来直接输出字符串的子集,如果 用的中括号来输出,就会有乱码,因为有的是由多个字符构成,输出char不能实现ASCII之外的输出。
  6. 最后有一个一点不太清楚,本地编译的时候正常,提交到c++(g++)上就输出异常,提交到c++(clang++)就能通过。比较奇怪。。。以后看看还能不能遇见。

AC代码:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<map>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int sum,i,j,la,lb,lc;
int x[5],a[101],b[101],c[101],aa[101],bb[101],cc[101];
int main(){
#ifdef ONLINE_JUDGE
#else 
    freopen("in.txt","r",stdin);
#endif
string n1,n2,n3;
memset(a,'\0',sizeof(a));memset(b,'\0',sizeof(b));memset(c,'\0',sizeof(c));memset(x,'\0',sizeof(x));
memset(aa,'\0',sizeof(aa));memset(bb,'\0',sizeof(bb));memset(cc,'\0',sizeof(cc));
getline(cin,n1);getline(cin,n2);getline(cin,n3);cin>>sum;//cout<<sum<<endl;
	for(i=0,j=0;i<n1.size();i++)
	{
		if(n1[i]=='[')a[j]=i+1;
		else if(n1[i]==']')aa[j++]=i-a[j];
	}la=j;
	for(i=0,j=0;i<n2.size();i++)
	{
		if(n2[i]=='[')b[j]=i+1;
		else if(n2[i]==']')bb[j++]=i-b[j];
	}lb=j;
	for(i=0,j=0;i<n3.size();i++)
	{
		if(n3[i]=='[')c[j]=i+1;
		else if(n3[i]==']')cc[j++]=i-c[j];
	}lc=j;
	while(sum--)
	{
		cin>>x[0]>>x[1]>>x[2]>>x[3]>>x[4];
		if(x[0]>la||x[1]>lb||x[2]>lc||x[3]>lb||x[4]>la||x[0]<=0||x[1]<=0||x[2]<=0||x[3]<=0||x[4]<=0)
			{cout<<"Are you kidding me? @\\/@"<<endl;
				continue;
			}
		cout<<n1.substr(a[x[0]-1],aa[x[0]-1])<<'(';
		cout<<n2.substr(b[x[1]-1],bb[x[1]-1]);
		cout<<n3.substr(c[x[2]-1],cc[x[2]-1]);
		cout<<n2.substr(b[x[3]-1],bb[x[3]-1])<<')';
		cout<<n1.substr(a[x[4]-1],aa[x[4]-1]);
		cout<<endl;
	}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值