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: Time Limit Exceeded)

import java.util.Scanner;

public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        sc.nextLine();
        final String s = sc.nextLine();
        final int combinations = (int) Math.pow(2, 26) - 1;
        int[] count = new int[26];
        for (int i = 0; i < s.length(); i++) {
            final char c = s.charAt(i);
            count[c - 97]++;
        }
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < count.length; i++) {
            if (count[i] > 0) {
                b.append("1");
            } else {
                b.append("0");
            }
        }
        final int target = Integer.parseInt(b.toString(), 2);
        long result = 0;
        for (int i = 1; i <= combinations; i++) {
            if ((target & i) == i) {
                //has combination
                String s1 = Integer.toBinaryString(i);
                while (s1.length() < 26) {
                    s1 = "0" + s1;
                }
                final char[] chars = s1.toCharArray();
                long r = 1;
                for (int i1 = 0; i1 < 26; i1++) {
                    if (chars[i1] == '1') {
                        r = (r * count[i1]) % 1_000_000_007;
                    }
                }
                result += r;
                result %= 1_000_000_007;
            }
        }
        System.out.println(result);
    }
}