アットコーダーの問題について(Colorful Subsequence)
下記アットコーダーの問題がわかりません。
https://atcoder.jp/contests/agc031/tasks/agc031_a
解説やACの方のコードを見てみましたが26サイズのint配列にc[各文字 - 'a']++を
し、A.答え *= c[i]を繰り返すと求めるべき出力になるのか理解できませんでした。
噛み砕いて解説いただけると幸いです。
ーー
問題文
長さ Nの文字列 Sが与えられます。
Sの部分列であって、すべて異なる文字からなるものの数を 10^9+7で割った余りを答えてください。文字列として同一でも、異なる位置から取り出された部分列は区別して数えることとします。
ただし、文字列の部分列とは、文字列から文字をいくつか 正の個数 取り出し、もとの文字列から順序を変えずにつなげたものを指します。
制約
1≤N≤100000
Sは英小文字からなる
入力
入力は以下の形式で標準入力から与えられる。
N
S
出力
異なる文字からなる部分列の個数を
10
9
+
7
で割った余りを出力せよ。
入力例 1
4
abcd
出力例 1
--
▼解説
同じ文字列でも、異なる位置から作られたものは区別するため、2N − 1 通りのすべての部分列が区別され ることになります。
条件より、同じ文字を 2 度使ってはいけないため、ある文字 c について colorful の条件を壊さないとり方 は (c の出現回数 + 1) となります (どれか 1 つを取るケース及び文字 c を一切取らないケース)
すべての文字 c についてのこのとり方の積を求め、空文字列の分の 1 を引いた数が答えとなります。
参照:AtCoder Grand Contest 031