SDNUOJ1062 传话

Alice和Bob还有其他几位好朋友在一起玩传话游戏。这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位。然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位……以此类推,直到倒数第二位告诉Bob。两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释。最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家。 

由于传话过程中可能出现一些偏差,游戏者越多,Bob最后听到的话就与Alice所想的越不同。Bob听到的话往往会变成一些很搞笑的东西,所以大家玩得乐此不疲。经过几轮游戏后,Alice注意到在两人传话中,有些词汇往往会错误地变成其他特定的词汇。Alice已经收集到了这样的一个词汇转化的列表,她想知道她的话传到Bob时会变成什么样子,请你写个程序来帮助她。

题意读假了,注意是所有人都会传错话,也就是说每经过一个人就会进行一次词汇转化

  • 注意substr(起始位置,长度)
  • 双指针 i = j + 1 还是 j 需要想想
  • getline如果上面有\n,就会读入进来,和是不是数字没啥关系。getline不忽略空白字符,所以要根据输入自己getchar一下
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

void solve(int u)
{
    int n, m;
    cin >> n >> m;
    std::map<string, string> mp;
    while(m -- ){
        string s, t;
        cin >> s >> t;
        mp[s] = t;
    }
    getchar();
    string str;
    getline(cin, str);
    str = str + " ";
    // cout << str << '\n';
    std::vector<string> v;
    for (int i = 0, j = 0; i < (int)str.size(); i = j + 1)
    {
        j = i;
        while(j < (int)str.size() && str[j] != ' ') {
            j ++;
        }
         string t = str.substr(i, j - i);
         int times = n - 1;
         while(times -- && mp.count(t)){
            t = mp[t];
        }
         v.push_back(t);
         // cout << t << '\n';
    }
    cout << "Case #" << u << ": ";
    for(int i = 0; i < (int)v.size(); i ++ ) {
        cout << v[i] << " \n"[i == (int)v.size() - 1];
    }
}

int main(){
    //std::ios::sync_with_stdio(false);
    //std::cin.tie(nullptr);
    int t;
    cin >> t;
    for (int i = 1; i <= t; i ++ ) {
        solve(i); 
    }  
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值