inline bool check(int m, std::string& a, std::string& b) { std::set<Hash> s; Hash hash; for (int i = 0; i < m; ++i) hash.add(a[i]); s.insert(hash); for (unsigned i = m, len = a.size(); i < len; ++i) { hash.rem(a[i - m], m - 1); hash.add(a[i]); s.insert(hash); } hash = Hash(); for (int i = 0; i < m; ++i) { hash.add(b[i]); } if (s.find(hash) != s.end()) { return true; } for (unsigned i = m, len = b.size(); i < len; ++i) { hash.rem(b[i - m], m - 1); hash.add(b[i]); if (s.find(hash) != s.end()) return true; } return false; }