题目链接:P3879 [TJOI2010] 阅读理解
题意:
英语老师留了 N N N 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过。
第一行为整数 N N N ,表示短文篇数,其中每篇短文只含空格和小写字母。
按下来的 N N N 行,每行描述一篇短文。每行的开头是一个整数 L L L ,表示这篇短文由 L L L 个单词组成。接下来是 L L L 个单词,单词之间用一个空格分隔。
然后为一个整数 M M M ,表示要做几次询问。后面有 M M M 行,每行表示一个要统计的生词。
对于 100 % 100% 100% 的数据, 1 ≤ M ≤ 1 0 4 1le Mle 10^4 1≤M≤104, 1 ≤ N ≤ 1 0 3 1le Nle 10^3 1≤N≤103 。
每篇短文长度(含相邻单词之间的空格) ≤ 5 × 1 0 3 le 5times 10^3 ≤5×103 字符,每个单词长度 ≤ 20 le 20 ≤20 字符。
要写 trie 也不是不行。但是懒。
直接用 u n o r d e r e d _ m a p + v e c t o r tt{unordered_map+vector} unordered_map+vector 水过
跑的还蛮快。注意要去重(不想用set,常数太大)
时间复杂度 O ( ∑ ∣ s i ∣ × m ) O(sum |s_i|times m) O(∑∣si∣×m)
代码:
#include#include #include #include #include #include #include #include #include #include #include using namespace std; #define int long long #define INF 0x3f3f3f3f3f3f3f3f #define N (int)(5e3+15) int n,Q; string s; int vis[N]; unordered_map >mp; signed main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); // freopen("check.in","r",stdin); // freopen("check.out","w",stdout); cin >> n; for(int i=1,x; i<=n; i++) { cin >> x; for(int j=1; j<=x; j++) cin >> s,mp[s].push_back(i); } cin >> Q; while(Q--) { cin >> s; for(int i=1; i<=n; i++) vis[i]=0; for(int i=0; i cout << mp[s][i] << ' '; vis[mp[s][i]]=1; } cout << 'n'; } return 0; }
转载请说明出处


![洛谷P3879 [TJOI2010] 阅读理解 题解 洛谷P3879 [TJOI2010] 阅读理解 题解](http://www.mshxw.com/aiimages/31/1014572.png)
