@@ -45,21 +45,18 @@ def check(nums, lookup, l, i):
45
45
return all (any (nums [i + k ] != nums [j + k ] for k in xrange (l )) for j in lookup )
46
46
47
47
result = 0
48
- base = P
48
+ cnt , h = [ 0 ] * len ( nums ), [ 0 ] * len ( nums )
49
49
for l in xrange (1 , len (nums )+ 1 ):
50
50
lookup = collections .defaultdict (list )
51
- cnt = h = 0
52
- for i in xrange (len (nums )):
53
- cnt += (nums [i ]% p == 0 )
54
- h = (h * P + nums [i ])% MOD
55
- if i - l >= 0 :
56
- cnt -= (nums [i - l ]% p == 0 )
57
- h = (h - nums [i - l ]* base )% MOD
58
- if i < l - 1 or cnt > k or not check (nums , lookup [h ], l , i - l + 1 ):
51
+ for i in xrange (len (nums )- l + 1 ):
52
+ cnt [i ] += (nums [i + l - 1 ]% p == 0 )
53
+ if cnt [i ] > k :
59
54
continue
60
- lookup [h ].append (i - l + 1 )
55
+ h [i ] = (h [i ]* P + nums [i + l - 1 ])% MOD
56
+ if not check (nums , lookup [h [i ]], l , i ):
57
+ continue
58
+ lookup [h [i ]].append (i )
61
59
result += 1
62
- base = (base * P )% MOD
63
60
return result
64
61
65
62
@@ -76,19 +73,14 @@ def countDistinct(self, nums, k, p):
76
73
"""
77
74
MOD , P = 10 ** 9 + 7 , 200
78
75
result = 0
79
- base = P
76
+ cnt , h = [ 0 ] * len ( nums ), [ 0 ] * len ( nums )
80
77
for l in xrange (1 , len (nums )+ 1 ):
81
78
lookup = set ()
82
- cnt = h = 0
83
- for i in xrange (len (nums )):
84
- cnt += (nums [i ]% p == 0 )
85
- h = (h * P + nums [i ])% MOD
86
- if i - l >= 0 :
87
- cnt -= (nums [i - l ]% p == 0 )
88
- h = (h - nums [i - l ]* base )% MOD
89
- if i < l - 1 or cnt > k :
79
+ for i in xrange (len (nums )- l + 1 ):
80
+ cnt [i ] += (nums [i + l - 1 ]% p == 0 )
81
+ if cnt [i ] > k :
90
82
continue
91
- lookup .add (h ) # assumed no collision
83
+ h [i ] = (h [i ]* P + nums [i + l - 1 ])% MOD
84
+ lookup .add (h [i ])
92
85
result += len (lookup )
93
- base = (base * P )% MOD
94
86
return result
0 commit comments