hash_set found; bool foo(uint hash) { if (found.find(hash) != found.end()) return true; found.insert(hash); return false; } vector > doit(vector > inp) { vector > hashes; vector > marked; for (int i = 0; i < inp.size(); ++i) { hashеs.push_back(vector()); marked.push_back(vector()); for (int j = 0; j < inp[i].size(); ++j) { uint h = 0; for (int k = 0; k < inp[i][j].size(); ++k) { h *= base; h += inp[i][j][k]; } hashes.back().push_back(h); marked.push_back(false); } } for (int i = 0; i < hashes.size(); ++i) { if (hashes[i].size() <= 2) continue; uint rh = 0; uint base3 = 1; for (int j = 0; j < 2; ++j) { rh *= base; rh += hashes[i][j]; base3 *= base; } for (int j = 2; j < hashes[i].size(); ++j) { rh *= base; rh += hashes[i][j]; if (foo(rh)) { marked[i][j-2] = marked[i][j-1] = marked[i][j] = true; } rh -= hashes[i][j-2] * base3; } } vector > out; for (int i = 0; i < marked.size(); ++i) { out.push_back(vector()); for (int j = 0; j < marked[i].size(); ++j) { if (!marked[i][j]) { out.back().push_back(inp[i][j]); } } } return out; }