Skip to content

ABC-345

A

URLURL\:\to

解法


B

URLURL\:\to

解法


C

URLURL\:\to https://atcoder.jp/contests/abc345/tasks/abc345_c

#文字列操作

S = String().content
L = [0]*26
flg = False
for i in S:
L[ord(i)-97] += 1
if L[ord(i)-97]>1: flg = True
for i in range(26-1):
for j in range(i+1,26):
ans += L[i]*L[j]
if flg == True: ans += 1
print(ans)

解法

入れ替える2つの文字をSi,  Sj(i<j)S_{i},\;S_{j}(i \lt j)とするとSiSjS_{i} \ne S_{j}の時、必ず入れ替えた後の文字列は違うものとなり、Si=Sx    &    ixS_{i}=S_{x}\;\;\&\;\;i \ne xが成立するxxを利用して同じものを作るものはできない(重複のない文字列を例に考えると、わかると思う)。

i(AZ)i(A \to Z)とし、LiL_{i}にそれぞれの出現をメモすると、ans=i=125j=i+126LiLjans=\sum\limits_{i=1}^{25}\sum\limits_{j=i+1}^{26}{L_{i}\cdot L_{j}}で表すことができる。したがって全体の計算量はO(N+2526)=O(N)O(N+25\cdot 26)=Ο(N)となり、十分に高速である。よって題意を満たすことができた。


D

URLURL\:\to

解法


E

URLURL\:\to

解法