题意
先给出n组缩写,每组缩写是一个单词(不含空格)对应一段文字(可能包含空格)。接着给出一篇p行缩写后的文章,要求输出原文章。只有缩写后文章中单词完全符合才可以替换,如果只是一部分符合如a与aa则不可替换。
思路
暴力上就行
技巧
1.string的map(映射)
可以通过map将string映射到string,实现查询缩写的功能。
map<string,string>mp;
mp[s]!="" //代表s在mp内出现过
mp[s]=="" //代表s在mp内没有出现过
2.getline相关
getline(cin,s);
读取当前行内的内容存放到s(string类型)中,注意如果上次读取后有空的换行要提前处理掉
3.substr
string类的函数,用于取出字符串的子串。可传1或2个参数,第一个参数是起始下标(从0开始计算),第二个参数是结束下标(如果传一个参数,默认第二个参数是到字符串末),左闭右开。
4.stringstream 字符串流
这玩意一般用不上,也可以通过其他方式避开,但是使用它可以方便一些。
因为从cin读取字符串时,空格符和换行符被视为相同的分隔符,所以要对他们有所区分的时候可以使用stringstream。
可以定义一个字符串流然后将一个字符串输入到流中,再从流中往外读取字符串。
一般的应用就是和getline结合,先从cin读取一行(换行符分隔),再输入到字符串流中,然后从字符串流中读取一个个单词(空格符分隔)。
完整代码
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int N=1e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-10;
map<string,string>mp;
int main() {
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
#endif
int n;
cin>>n;
while(n--)
{
string s,t;
cin>>s;
getline(cin,t);
mp[s]=t.substr(1);
}
cin>>n;
string s;
getline(cin,s); //处理换行符
while(n--)
{
stringstream ss;
string s;
getline(cin,s);
ss<<s;
while(ss>>s)
{
if(mp[s]!="") cout<<mp[s]; //少输出一个空格为了避免从s中删去最后一个字符(空格)的开销与代码量
else cout<<s<<' ';
}
cout<<endl;
}
return 0;
}