結果
| 問題 |
No.1848 Long Prefixes
|
| コンテスト | |
| ユーザー |
👑 potato167
|
| 提出日時 | 2021-12-07 14:58:45 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 165 ms / 2,000 ms |
| コード長 | 758 bytes |
| コンパイル時間 | 521 ms |
| コンパイル使用メモリ | 82,828 KB |
| 実行使用メモリ | 126,412 KB |
| 最終ジャッジ日時 | 2024-06-29 07:58:07 |
| 合計ジャッジ時間 | 6,370 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 40 |
ソースコード
def z_algo(p):
n=len(p)
Z=[0]*n
Z[0]=n
i=1
j=0
while i<n:
while i+j<n and p[j]==p[i+j]:
j+=1
Z[i]=j
if j==0:
i+=1
continue
k=1
while k<j and k+Z[k]<j:
Z[i+k]=Z[k]
k+=1
i+=k
j-=k
return Z
N=int(input())
A=list(map(int,input().split()))
S=input()
M=10**9+7
half=(M+1)//2
p=[('#',100)]*(N)
cum_sum=[0]*(N+1)
for i in range(N-1):
p[i]=(S[i+1],A[i+1])
cum_sum[i+1]=(cum_sum[i]+A[i+1])%M
cum_sum[N]=cum_sum[N-1]
Z=z_algo(p)
ans=0
for i in range(N):
if S[i]!=S[0]:
continue
if A[i]<A[0]:
ans+=((A[i]+1)*A[i])//2
ans%=M
else:
ans+=(A[0]*(A[i]-A[0]))
ans%=M
ans+=(A[0]*(A[0]+1))//2
ans%=M
ans+=cum_sum[Z[i]]
if i+Z[i]+1<N and S[i+1+Z[i]]==S[1+Z[i]]:
ans+=min(A[i+1+Z[i]],A[1+Z[i]])
ans%=M
print(ans)
potato167