14698: g2g c u l8r

题意

先给出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;
}