Problem:
Score : 200 points

Problem Statement

You are given a string S of length N.
Among its subsequences, count the ones such that all characters are different, modulo 10^9+7. Two subsequences are considered different if their characters come from different positions in the string, even if they are the same as strings.

Here, a subsequence of a string is a concatenation of one or more characters from the string without changing the order.

Constraints

1 \leq N \leq 100000

S consists of lowercase English letters.

|S|=N

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the number of the subsequences such that all characters are different, modulo 10^9+7.

Sample Input 1

4
abcd

Sample Output 1

15

Since all characters in S itself are different, all its subsequences satisfy the condition.

Sample Input 2

3
baa

Sample Output 2

5

The answer is five: b, two occurrences of a, two occurrences of ba. Note that we do not count baa, since it contains two as.

Sample Input 3

5
abcab

Sample Output 3

17

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

// baa x
// b
// ba
// b a
//  a
//  aa x
//   a
// ___
// 2^3-1-2

// 2^4-1

// 5
// abcab
// 2^5-1-1-2^(5-2)+1-2^(5-2)+1+2^(2-1)-1
// = 32-1-1-7-7+1= 17
// 2^2x2x2+1
import java.util.*;

public class Main {
  private static final int MOD = 1_000_000_007;
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    String S = sc.next();
    Map<Character, Integer> map = new HashMap<>();
    for (int i = 0; i < N; i++) {
      char c = S.charAt(i);
      map.put(c, map.getOrDefault(c, 0)+1);
    }
    long ans = 0;
    int kind = map.size();
    for (int count : map.values()) {
      ans += power(kind-1)*count%MOD;
      ans %= MOD;
    }
    System.out.println(ans);
  }
  private static long power(int n) {
    if (n == 0) {
      return 1;
    }
    if (n%2 == 1) {
      return power(n/2)*2%MOD;
    }
    long half = power(n/2);
    return half*half%MOD;
  }
}