int main() { cout <<setprecision(10); ll n ; string s; cin >> n >> s; int num[26]; rep(i,26) num[i] = 0; rep(i,26){ char c = 'a' + i ; rep(j,s.size()){ if(s[j] == c){ num[i] ++; } } } ll ans = 1; rep(i,26){ if(num[i] != 0){ ans *= num[i]+1 ; ans %= mod; } } ans --; cout << ans << endl; }
難し目の問題
解法
a ~ z
までの文字に対して、それぞれ何文字ずつあるか数える
各アルファベットに対して、1個以上存在するのであれば、
そのアルファベットを取らない、1個目を取る、2個目を取る…(存在するだけ数N番目を取る)
のn+1の選択肢がある
正直あんまりよく分かっていない
ただ、与えられた文字列の中からどの文字を使うかだけ決めたら、使う文字に対して答えは+1しかされないので
どのような選び方があるかだけ考えればよいし、まあ。はあ。
で、
各アルファベットが存在するならその数+1をかけていって
最後に-1する
ちょっと元気がないから雑。許してね。