。
题意:多组数据。给出两个长度(不等)和两行序列,求交集。
思路:想到严蔚敏数据结构书上一段伪代码,大致是去重合并两个数组。这题就时这么做,写题解的原因是,一开始用cin老是超时,还以为有特殊情况没有考虑,原来真的是超时啊!
解决方案:1. 不把结果存在第三个数组中,而是直接输出。最后一个数后面不跟空格,也可以处理。
2. 放弃cin专用scanf
3. 加上一段
std::ios::sync_with_stdio(false); cin.tie(0);给输入流加速,好像是因为关闭了了c++对c输入输出的兼容性,具体原理不太清楚,如果以后再见再查。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<set> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; const int maxm = 1e6+10; int n, m, a[maxm], b[maxm], c[maxm]; int main() { std::ios::sync_with_stdio(false); cin.tie(0); while(cin >> n >> m){ for(int i = 0; i < n; i++){ cin >> a[i]; } for(int i = 0; i < m; i++){ cin >> b[i]; } int p1 = 0, p2 = 0, p3 = 0; while(p1 < n && p2 < m){ if(a[p1] == b[p2]){ c[p3++] = a[p1]; p1++;p2++; } else if(a[p1] < b[p2]){ p1++; } else if(b[p2] < a[p1]){ p2++; } } if(p3 > 0){ for(int i = 0; i < p3-1; i++){ cout << c[i] << " "; } cout << c[p3-1] << endl; } else{ cout << "empty" << endl; } } return 0; }