結果
問題 | No.2020 Sum of Common Prefix Length |
ユーザー |
|
提出日時 | 2022-07-12 23:26:18 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 984 ms / 2,000 ms |
コード長 | 2,120 bytes |
コンパイル時間 | 195 ms |
コンパイル使用メモリ | 82,688 KB |
実行使用メモリ | 277,864 KB |
最終ジャッジ日時 | 2024-06-23 21:36:25 |
合計ジャッジ時間 | 26,886 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 38 |
ソースコード
import sysfrom copy import deepcopyreadline = 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 sclass 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])query = lambda self,p:self.B_v._sum(self.begin[p]+1)def main():N = int(readline())S = tuple(list(map(lambda c:ord(c)-97,readline().rstrip())) for _ in range(N))Q = int(readline())T = [0]*QX = [0]*QC = [0]*Qfor i in range(Q):I = readline().split()T[i] = int(I[0]);X[i] = int(I[1])-1if T[i]==1:C[i] = ord(I[2][0])-97len_node = 1nex = [[-1]*26 for i in range(400000)]S2 = deepcopy(S)for i in range(Q):if T[i] == 1:S2[X[i]].append(C[i])for i in range(N):now_node = 0for z in S2[i]:if nex[now_node][z] == -1:nex[now_node][z] = len_nodelen_node += 1now_node = nex[now_node][z]V = len_nodeEul = EulerTour(tuple(tuple(elem for elem in nex[i] if elem != -1) for i in range(V)))now_nodes = [0]*Nfor i in range(N):for z in S[i]:now_nodes[i] = nex[now_nodes[i]][z]Eul.add(now_nodes[i])for t,x,c in zip(T,X,C):if t == 1:now_nodes[x] = nex[now_nodes[x]][c]Eul.add(now_nodes[x])else:print(Eul.query(now_nodes[x]))if __name__ == "__main__":main()