#include <cstdio>
#include <algorithm>
#include <unordered_map>
#include <vector>
#include <utility>
#include <climits>
using namespace std;
struct Point {
int x;
int y;
Point() : x(0), y(0) {}
Point(int a, int b) : x(a), y(b) {}
};
class Solution {
public:
int maxPoints(vector<Point> &points) {
if (points.size() <= 2) return points.size();
int res = 2;
unordered_map<float, int> mp;
for (int i = 0; i < points.size(); ++i) {
mp.clear();
int vertical = 1, cur = 1, cnt = 0; // vertical:单计垂线,
// cnt单计相同节点的个数
for (int j = i + 1; j < points.size(); ++j) {
if (points[j].y == points[i].y && points[j].x == points[i].x) { cnt++; continue; }
if (points[j].x == points[i].x) { cur = max(cur, ++vertical); continue; }
float k = (float)(points[j].y - points[i].y) / (points[j].x - points[i].x);
if (mp.find(k) == mp.end()) { mp.insert(make_pair(k, 2)); cur = max(cur, 2); }
else cur = max(cur, ++mp[k]);
}
cur += cnt;
res = max(res, cur);
}
return res;
}
};