日刊競プロ ABC 226 -B- Counting Arrays-
問題文
1 から N までの番号がついた N 個の数列が与えられます。
数列 i は、長さが Liで j (1≤j≤Li) 番目の要素が ai,jであるような数列です。
数列 i と 数列 j は、 Li=Ljかつすべての k (1≤k≤Li) に対して ai,k
=aj,kが成り立つ時に同じであるとみなします。
同じ数列は 1 種類として数えるとき、数列 1 から 数列 N の中に全部で何種類の数列がありますか?
制約
1≤N≤2×10**5
1≤Li≤2×10**5(1≤i≤N)
0≤ai,j≤10**9(1≤i≤N,1≤j≤Li)
すべての数列の要素の個数の和、すなわち ∑
i=ΣLiは 2×10**5を超えない。
入力はすべて整数である。
考えたこと
最近現在のratingと同じくらいの問題を解くようにしている.
長さLの配列が与えられるので,何種類の配列が与えられるかを答える.
[1,2]と[2,1]は別の配列としてカウントするので,ans[配列の中身]=1として入力をN回受け付けて,最後にans配列の大きさを測定すれば答えがわかると考えた.
回答
from collections import defaultdict
d = defaultdict(int)
N = int(input())
for _ in range(N):
alist = list((map(int,input().split())))
temp = ('').join(str(alist[1::]))
d[temp]=1
print (len(d.items()))
dictのkeyを配列にすることも考えたが,errorが起きたので文字列でkeyにしている.
あとは普通に同じ配列を削除すれば良いのでset関数を使う等もあると考えた.
N = int(input())
ans =[]
for _ in range(N):
alist = list((map(int,input().split())))
ans.append(str(alist[1::]))
print (len(list(set(ans))))
配列の中身が配列の場合,うまくset関数を使うことができなかったため文字列に直している.
解説と回答
入力をそのまま文字列として見れば以下のようにも回答可能らしい
N=int(input())
print(len(set(input()for i in range(N))))