# 计蒜客 ACM-ICPC 2018 徐州赛区网络预赛 F. Features Track(unordered_map+模拟)

## Description:

Morgana is learning computer vision, and he likes cats, too. One day he wants to find the cat movement from a cat video. To do this, he extracts cat features in each frame. A cat feature is a two-dimension vector <$x$, $y$>. If $x_i$ = $x_j$ and $y_i$ = $y_j$, then <$x_i$, $y_i$> <$x_j$, $y_j$> are same features.

So if cat features are moving, we can think the cat is moving. If feature <$a$, $b$> is appeared in continuous frames, it will form features movement. For example, feature <$a$ , $b$ > is appeared in frame $2,3,4,7,8$, then it forms two features movement $2-3-4$ and $7-8$ .

Now given the features in each frames, the number of features may be different, Morgana wants to find the longest features movement.

## Input:

First line contains one integer $T(1 \le T \le 10)$ , giving the test cases.

Then the first line of each cases contains one integer $n$ (number of frames),

In The next $n$ lines, each line contains one integer $k_i$ ( the number of features) and $2k_i$ intergers describe $k_i$ features in ith frame.(The first two integers describe the first feature, the $3$rd and $4$th integer describe the second feature, and so on).

In each test case the sum number of features $N$ will satisfy $N \le 100000$ .

## Output:

For each cases, output one line with one integers represents the longest length of features movement.

1
8
2 1 1 2 2
2 1 1 1 4
2 1 1 2 2
2 2 2 1 4
0
0
1 1 1
1 1 1

3

## AC代码:

#include <bits/stdc++.h>
using namespace std;

struct Vector {
long long X, Y;
bool operator == (const Vector &A) const {
return A.X == X && A.Y == Y;
}
};

struct Hash {
size_t operator() (const Vector &A) const {
return hash<long long>()(A.X) + hash<long long>()(A.Y);
}
};

unordered_map<Vector, long long, Hash> mp[3];

int main(int argc, char *argv[]) {
int T;
scanf("%d", &T);
for (int Case = 1, N; Case <= T; ++Case) {
scanf("%d", &N);
long long Ans = -1;
for (long long i = 0, K; i < N; ++i) {
scanf("%lld", &K);
if (i == 0) {
mp[1].clear();
for (long long j = 0, X, Y; j < K; ++j) {
scanf("%lld%lld", &X, &Y);
mp[1].emplace(Vector{X, Y}, 1);
}
Ans = 1;
}
else if (i & 1) {
mp[2].clear();
for (long long j = 0, X, Y; j < K; ++j) {
scanf("%lld%lld", &X, &Y);
if (mp[1].find(Vector{X, Y}) != mp[1].end()) {
long long Temp = mp[1][Vector{X, Y}] + 1;
mp[2].emplace(Vector{X, Y}, Temp);
Ans = max(Ans, Temp);
}
else {
mp[2].emplace(Vector{X, Y}, 1);
}
}
}
else {
mp[1].clear();
for (long long j = 0, X, Y; j < K; ++j) {
scanf("%lld%lld", &X, &Y);
if (mp[2].find(Vector{X, Y}) != mp[2].end()) {
long long Temp = mp[2][Vector{X, Y}] + 1;
mp[1].emplace(Vector{X, Y}, Temp);
Ans = max(Ans, Temp);
}
else {
mp[1].emplace(Vector{X, Y}, 1);
}
}
}
}
printf("%lld\n", Ans);
}
return 0;
}