結果
問題 | No.2020 Sum of Common Prefix Length |
ユーザー |
|
提出日時 | 2022-06-06 19:09:35 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,236 bytes |
コンパイル時間 | 369 ms |
コンパイル使用メモリ | 82,456 KB |
実行使用メモリ | 318,148 KB |
最終ジャッジ日時 | 2024-06-23 11:12:47 |
合計ジャッジ時間 | 24,394 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 36 TLE * 2 |
ソースコード
import sysreadline = sys.stdin.readlineclass Fenwick_Tree:def __init__(self,N:int):self.N = Nself.dat = [0]*(N+1)def inc(self,p:int):p += 1while p <= self.N:self.dat[p] += 1p += p&-pdef dec(self,p:int):p += 1while p <= self.N:self.dat[p] -= 1p += p&-pdef _sum(self,r:int):s = 0while r:s += self.dat[r]r -= r&-rreturn ssum = lambda self,l,r:self._sum(r)-self._sum(l)class EulerTour:def __init__(self,G):self.N = len(G)self.begin = [0]*self.Nself.end = [0]*self.Nself.B_v = Fenwick_Tree(self.N*2)cnt = 0f = 0itr = [0]*self.Npar = [0]*self.Npar[f] = -1while f != -1:if itr[f] == 0:self.begin[f] = cnt;cnt+=1if itr[f] == len(G[f]):self.end[f] = cnt;cnt+=1f = par[f]continuepar[G[f][itr[f]]] = fitr[f]+=1f = G[f][itr[f]-1]def add(self,p:int):self.B_v.inc(self.begin[p])self.B_v.dec(self.end[p])def query(self,p:int):return self.B_v.sum(0,self.begin[p]+1)def main():N = int(readline())S = [readline().rstrip() for _ in range(N)]Q = int(readline())T = [0]*QX = [0]*QC = [""]*Qfor i in range(Q):I = readline().rstrip().split()T[i] = int(I[0]);X[i] = int(I[1])-1if T[i]==1:C[i] = I[2]path = [[0] for _ in range(N)]node = [""]nex = [[-1]*26]S2 = S[:]for i in range(Q):if T[i] == 1:S2[X[i]] += C[i]for i in range(N):now_node = 0for c in S2[i]:z = ord(c)-97if nex[now_node][z] == -1:nex[now_node][z] = len(node)node.append(c)nex.append([-1]*26)now_node = nex[now_node][z]path[i].append(now_node)V = len(node)G = [[] for _ in range(V)]for i in range(V):for j in range(26):if nex[i][j] != -1:G[i].append(nex[i][j])Eul = EulerTour(G)len_S = list(map(len,S))for i in range(N):for j in range(len_S[i]):Eul.add(path[i][j+1])for i in range(Q):if T[i] == 1:len_S[X[i]] += 1Eul.add(path[X[i]][len_S[X[i]]])else:print(Eul.query(path[X[i]][len_S[X[i]]]))if __name__ == "__main__":main()