結果
| 問題 |
No.852 連続部分文字列
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-07-23 13:31:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,382 ms / 3,153 ms |
| コード長 | 1,354 bytes |
| コンパイル時間 | 161 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 158,684 KB |
| 最終ジャッジ日時 | 2024-07-05 01:25:43 |
| 合計ジャッジ時間 | 19,416 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
class Bit:
def __init__(self, n):
self.size = n
self.tree = [0] * (n + 1)
def sum(self, i):
s = 0
while i > 0:
s += self.tree[i]
i -= i & -i
return s
def add(self, i, x):
while i <= self.size:
self.tree[i] += x
i += i & -i
class RangeUpdate:
def __init__(self, n):
self.p = Bit(n + 1)
self.q = Bit(n + 1)
def add(self, s, t, x):
t += 1
self.p.add(s, -x * s)
self.p.add(t, x * t)
self.q.add(s, x)
self.q.add(t, -x)
def sum(self, s, t):
t += 1
return self.p.sum(t) + self.q.sum(t) * t - \
self.p.sum(s) - self.q.sum(s) * s
#yukicoder218B
s = input()
ngs = len(s)
alp = [[] for i in range(26)]
li = [0]*(ngs)
rui = [0]*(ngs+1)
for i in range(ngs):
idx = ord(s[i]) - ord("a")
li[i] = li[i-1]
if len(alp[idx]) == 0:
li[i] += 1
alp[idx].append(i)
ru = RangeUpdate(ngs+1)
for i in range(ngs):
ru.add(i+1,i+1,li[i])
ans = ru.sum(1,ngs)
aidx = [1]*26
for i in range(1,ngs):
idx = ord(s[i-1]) - ord("a")
if len(alp[idx]) <= aidx[idx]:
ru.add(i+1,ngs,-1)
else:
ru.add(i+1,alp[idx][aidx[idx]],-1)
aidx[idx] += 1
ans += ru.sum(i+1,ngs)
print(ans/((ngs*(ngs+1))/2))