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