Use this to learn the idea, then write your own version.
123 4import itertools5 6 789class SegmentTree(object):10 def __init__(self, N,11 build_fn=lambda _: float("inf"),12 query_fn=lambda x, y: x if y is None else min(x, y),13 update_fn=lambda x: x):14 self.tree = [None]*(2*2**((N-1).bit_length()))15 self.base = len(self.tree)216 self.query_fn = query_fn17 self.update_fn = update_fn18 for i in xrange(self.base, self.base+N):19 self.tree[i] = build_fn(i-self.base)20 for i in reversed(xrange(1, self.base)):21 self.tree[i] = query_fn(self.tree[2*i], self.tree[2*i+1])22 23 def update(self, i, h):24 x = self.base+i25 self.tree[x] = self.update_fn(h)26 while x > 1:27 x = 228 self.tree[x] = self.query_fn(self.tree[x*2], self.tree[x*2+1])29 30 3132class Solution(object):33 def longestRepeating(self, s, queryCharacters, queryIndices):34 """35 :type s: str36 :type queryCharacters: str37 :type queryIndices: List[int]38 :rtype: List[int]39 """40 LEFT, RIGHT, LEFT_LEN, RIGHT_LEN, LEN, MAX_LEN, SIZE = xrange(7)41 def build(i):42 return update(s[i])43 44 def update(y):45 result = [0]*SIZE46 result[LEFT] = result[RIGHT] = y47 result[LEN] = result[LEFT_LEN] = result[RIGHT_LEN] = result[MAX_LEN] = 148 return result49 50 def query(x, y):51 return x if y is None else \52 [x[LEFT],53 y[RIGHT],54 x[LEFT_LEN]+(y[LEFT_LEN] if x[LEFT_LEN] == x[LEN] and x[RIGHT] == y[LEFT] else 0),55 y[RIGHT_LEN]+(x[RIGHT_LEN] if y[RIGHT_LEN] == y[LEN] and y[LEFT] == x[RIGHT] else 0),56 x[LEN]+y[LEN],57 max(x[MAX_LEN], y[MAX_LEN], x[RIGHT_LEN]+y[LEFT_LEN] if x[RIGHT] == y[LEFT] else 0)]58 59 result = []60 st = SegmentTree(len(s), build_fn=build, query_fn=query, update_fn=update)61 for c, i in itertools.izip(queryCharacters, queryIndices):62 st.update(i, c)63 result.append(st.tree[1][MAX_LEN])64 return result65 66 676869import itertools70 71 727374class SegmentTree2(object):75 def __init__(self, N,76 build_fn=lambda _: float("inf"),77 query_fn=lambda x, y: y if x is None else x if y is None else min(x, y),78 update_fn=lambda x: x):79 self.tree = [None]*(2*2**((N-1).bit_length()))80 self.base = len(self.tree)281 self.query_fn = query_fn82 self.update_fn = update_fn83 for i in xrange(self.base, self.base+N):84 self.tree[i] = build_fn(i-self.base)85 for i in reversed(xrange(1, self.base)):86 self.tree[i] = query_fn(self.tree[2*i], self.tree[2*i+1])87 88 def update(self, i, h):89 x = self.base+i90 self.tree[x] = self.update_fn(h)91 while x > 1:92 x = 293 self.tree[x] = self.query_fn(self.tree[x*2], self.tree[x*2+1])94 95 def query(self, L, R):96 if L > R:97 return None98 L += self.base99 R += self.base100 left = right = None101 while L <= R:102 if L & 1:103 left = self.query_fn(left, self.tree[L])104 L += 1105 if R & 1 == 0:106 right = self.query_fn(self.tree[R], right)107 R -= 1108 L = 2109 R = 2110 return self.query_fn(left, right)111 112 113114class Solution2(object):115 def longestRepeating(self, s, queryCharacters, queryIndices):116 """117 :type s: str118 :type queryCharacters: str119 :type queryIndices: List[int]120 :rtype: List[int]121 """122 LEFT, RIGHT, LEFT_LEN, RIGHT_LEN, LEN, MAX_LEN, SIZE = xrange(7)123 def build(i):124 return update(s[i])125 126 def update(y):127 result = [0]*SIZE128 result[LEN] = result[LEFT_LEN] = result[RIGHT_LEN] = result[MAX_LEN] = 1129 result[LEFT] = result[RIGHT] = y130 return result131 132 def query(x, y):133 return y if x is None else x if y is None else \134 [x[LEFT],135 y[RIGHT],136 x[LEFT_LEN]+(y[LEFT_LEN] if x[LEFT_LEN] == x[LEN] and x[RIGHT] == y[LEFT] else 0),137 y[RIGHT_LEN]+(x[RIGHT_LEN] if y[RIGHT_LEN] == y[LEN] and y[LEFT] == x[RIGHT] else 0),138 x[LEN]+y[LEN],139 max(x[MAX_LEN], y[MAX_LEN], x[RIGHT_LEN]+y[LEFT_LEN] if x[RIGHT] == y[LEFT] else 0)]140 141 result = []142 st = SegmentTree2(len(s), build_fn=build, query_fn=query, update_fn=update)143 for c, i in itertools.izip(queryCharacters, queryIndices):144 st.update(i, c)145 result.append(st.query(0, len(s)-1)[MAX_LEN])146 return result147