这道题因为出现在第五章,所以是不需要什么算法的,就是使用stl乱搞就行了,虽然stl的效率很低,但是还是能过的,我的思路就是两个映射,一个是映射一篇文章里面的所有的单词,为了去重,所以用set,第二个是每篇文章的每一行都映射一下这一行里面的单词,接下来进行四个操作的时候,外层遍历文章,先用第一个映射看看这个文章里是不是符合要求,如果符合要求,那么内层遍历这个文章的所有行,这时用第二个映射,判断当前行是不是符合要求,来决定输出,最后程序的一个实现小细节是,对于每个操作,两篇文章之间要有10个同样的-号,第一篇文章之前,最后一篇文章之后不需要输出,这个坑的地方就是我看pdf明明是9个,但是看了看原文,结果写的是10个,以后还是要把英文的输入输出格式给看看,不能一点不看,
最后,因为寻思里面都是字符串的比较,所以是不是给每个字符串分配一个整数id,然后对整数进行操作是不是更快一点,就像这一章前面的例题讲的很重要的方法那样,然后就改了,中间还出现了一会儿编译错误,是有的地方的string传函数的时候不能传引用,也不知道为啥会这个样子,最后提交发现时间也没变快,还是原来的那样,可能是单词数目太多的缘故把
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
string s[105][1500];
map<pa, unordered_set<int> > mp;
map<int, unordered_set<int> > mp2;
map<string, int> mp3;
vector<string> v;
int getid(string s) {
if (mp3.find(s) != mp3.end()) return mp3[s];
v.pb(s);
return mp3[s] = sz(v) - 1;
} //写这个东西并没有变快
int main() {
int n;
cin >> n