""" (c) http://stackoverflow.com/a/15970880
var A = new int[] {4, 5, 1, 5, 7, 6, 8, 4, 1};
var D = new Dictionary<int, HashSet<int>>();
foreach(int n in A)
{
if(D.ContainsKey(n-1) && D.ContainsKey(n+1))
{
D[n-1].UnionWith(D[n+1]);
D[n+1] = D[n] = D[n-1];
}
else if(D.ContainsKey(n-1))
{
D[n] = D[n-1];
}
else if(D.ContainsKey(n+1))
{
D[n] = D[n+1];
}
else if(!D.ContainsKey(n))
{
D.Add(n, new HashSet<int>());
}
D[n].Add(n);
}
int result = int.MinValue;
foreach(HashSet<int> H in D.Values)
{
if(H.Count > result)
{
result = H.Count;
}
}
"""
import random
def find_some_set(A):
D = {} # mapping: n -> set
for n in A:
if (n-1) in D and (n+1) in D: # O(1), worst case O(N)
D[n-1] |= D[n+1] # union: w.c. O(len(D[n-1]) + len(D[n+1])) = O(N)
D[n+1] = D[n] = D[n-1]
elif (n-1) in D:
D[n] = D[n-1]
elif (n+1) in D:
D[n] = D[n+1]
elif n not in D:
D[n] = set()
D[n].add(n) # O(1), w.c. O(N)
return max(D.values(), key=len) # O(N)
def random_seq(N, randint=random.randint):
return [randint(0, N**3) for _ in range(N)]
def allsame_seq(N, randint=random.randint):
return [randint(0, N**3)] * N
def range_seq(N):
return list(range(N))
if __name__ == "__main__":
result_set = find_some_set([10, 5, 3, 1, 4, 2, 8, 7, 0])
print(len(result_set), result_set)
IiIiIChjKSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNTk3MDg4MAp2YXIgQSA9IG5ldyBpbnRbXSB7NCwgNSwgMSwgNSwgNywgNiwgOCwgNCwgMX07CnZhciBEID0gbmV3IERpY3Rpb25hcnk8aW50LCBIYXNoU2V0PGludD4+KCk7Cgpmb3JlYWNoKGludCBuIGluIEEpCnsKICAgIGlmKEQuQ29udGFpbnNLZXkobi0xKSAmJiBELkNvbnRhaW5zS2V5KG4rMSkpCiAgICB7CiAgICAgICAgRFtuLTFdLlVuaW9uV2l0aChEW24rMV0pOwogICAgICAgIERbbisxXSA9IERbbl0gPSBEW24tMV07CiAgICB9CiAgICBlbHNlIGlmKEQuQ29udGFpbnNLZXkobi0xKSkKICAgIHsKICAgICAgICBEW25dID0gRFtuLTFdOwogICAgfQogICAgZWxzZSBpZihELkNvbnRhaW5zS2V5KG4rMSkpCiAgICB7CiAgICAgICAgRFtuXSA9IERbbisxXTsKICAgIH0KICAgIGVsc2UgaWYoIUQuQ29udGFpbnNLZXkobikpCiAgICB7CiAgICAgICAgRC5BZGQobiwgbmV3IEhhc2hTZXQ8aW50PigpKTsKICAgIH0KCiAgICBEW25dLkFkZChuKTsKfQoKaW50IHJlc3VsdCA9IGludC5NaW5WYWx1ZTsKZm9yZWFjaChIYXNoU2V0PGludD4gSCBpbiBELlZhbHVlcykKewogICAgaWYoSC5Db3VudCA+IHJlc3VsdCkKICAgIHsKICAgICAgICByZXN1bHQgPSBILkNvdW50OwogICAgfQp9CiIiIgppbXBvcnQgcmFuZG9tCgpkZWYgZmluZF9zb21lX3NldChBKToKICAgIEQgPSB7fSAjIG1hcHBpbmc6IG4gLT4gc2V0CiAgICBmb3IgbiBpbiBBOgogICAgICAgIGlmIChuLTEpIGluIEQgYW5kIChuKzEpIGluIEQ6ICMgTygxKSwgd29yc3QgY2FzZSBPKE4pCiAgICAgICAgICAgIERbbi0xXSB8PSBEW24rMV0gIyB1bmlvbjogdy5jLiBPKGxlbihEW24tMV0pICsgbGVuKERbbisxXSkpID0gTyhOKQogICAgICAgICAgICBEW24rMV0gPSBEW25dID0gRFtuLTFdCiAgICAgICAgZWxpZiAobi0xKSBpbiBEOgogICAgICAgICAgICBEW25dID0gRFtuLTFdCiAgICAgICAgZWxpZiAobisxKSBpbiBEOgogICAgICAgICAgICBEW25dID0gRFtuKzFdCiAgICAgICAgZWxpZiBuIG5vdCBpbiBEOgogICAgICAgICAgICBEW25dID0gc2V0KCkKICAgICAgICBEW25dLmFkZChuKSAjIE8oMSksIHcuYy4gTyhOKQoKICAgIHJldHVybiBtYXgoRC52YWx1ZXMoKSwga2V5PWxlbikgIyBPKE4pCgpkZWYgcmFuZG9tX3NlcShOLCByYW5kaW50PXJhbmRvbS5yYW5kaW50KToKICAgIHJldHVybiBbcmFuZGludCgwLCBOKiozKSBmb3IgXyBpbiByYW5nZShOKV0KCmRlZiBhbGxzYW1lX3NlcShOLCByYW5kaW50PXJhbmRvbS5yYW5kaW50KToKICAgIHJldHVybiBbcmFuZGludCgwLCBOKiozKV0gKiBOCgpkZWYgcmFuZ2Vfc2VxKE4pOgogICAgcmV0dXJuIGxpc3QocmFuZ2UoTikpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHJlc3VsdF9zZXQgPSBmaW5kX3NvbWVfc2V0KFsxMCwgNSwgMywgMSwgNCwgMiwgOCwgNywgMF0pCiAgICBwcmludChsZW4ocmVzdWx0X3NldCksIHJlc3VsdF9zZXQp