首页 > 试题广场 >

おみやげをまらいました

[编程题]おみやげをまらいました
  • 热度指数:239 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
おみやげをまらいました! 
 
蛙蛙还是给你带来了礼物。但它有个小小的要求,那就是你得在石头剪刀布上赢过它才能拿到礼物哦! 
你们这样规定:有三个字符串  ,表示三种出拳种类,其中  可以打败  ,  可以打败  ,  可以打败  。
现在根据你的观察,你已经知道了蛙蛙心想的出拳顺序,你需要安排自己的出拳顺序,使得你能在每一局中都获胜。

“焼きまんじゅう”、“ういろう”、“⽡せんべい”、“福だるま”、“⽉うさぎのボタン”……

输入描述:
前三行每行两个字符串,每行  ,表示  能打败 。 
数据保证不互相矛盾,且其中有恰好三种不同的字符串。 
接下去一个数 ,表示 次对战。 
接下去 行每行一个字符串,表示蛙蛙的出拳种类。注意,蛙蛙的出拳可能不合法(即不是三种字符串中的),这时请输出  。


输出描述:
 行,每行一个字符串,表示每一局你需要出什么。 
如果对手出的不合法,输出  。
示例1

输入

stone sci
sci paper
paper stone
4
stone
sci
spock
paper

输出

paper
stone
Fake
sci

备注:
输入输出全程零拷贝版:
#define AUTHOR "JiangXiangyu"
#define IOV_CMP(a, b) ((a).iov_len == (b).iov_len && !memcmp((a).iov_base, (b).iov_base, (a).iov_len))
const struct iovec fake = {"Fake\n", 5};
struct iovec s[3][2]; // 赢者(输出)-输者(输入)对照关系
struct iovec ans[100];
int main() {
    read_prepare(); // 输入内存映射
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            s[i][j] = read_iovec();
        }
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (i == j) continue;
            if (IOV_CMP(s[i][0], s[j][1])) { // 两者内容相同
                s[i][0] = s[j][1];
                s[i][0].iov_len++; // 输入中s[j][1]的下个字符是换行符
                break;
            }
        }
    }
    int n = read_uint();
    for (int i = 0; i < n; i++) {
        struct iovec input = read_iovec();
        for (int j = 0; j < 3; j++) {
            if (IOV_CMP(input, s[j][1])) {
                ans[i] = s[j][0]; // 输出带换行符
                break;
            }
        }
        if (!ans[i].iov_base) ans[i] = fake;
    }
    writev(STDOUT_FILENO, ans, n);
    return 0;
}

发表于 今天 04:49:02 回复(0)

问题信息

难度:
1条回答 197浏览

热门推荐

通过挑战的用户

查看代码
おみやげをまらいました