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;
}