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: Runtime Error)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        System.out.println(subStringCount(s));
        System.out.println((subStringCount(s) % (1000000007)));

    }

    public static int subStringCount(String string) {
        int size = 1, count = 0;
        while (size <= string.length()) {
            for (int j = 0; j <= string.length() - size; j++) {
                String sub = string.substring(j, j + size);
                if (!isDuplicate(sub)) {
                    count++;
                    System.out.println(sub);
                }
                for (int i = 1; i < string.length() - size - 1; i++) {
                    String sub2 = string.substring(1, i) + string.substring(i + size);
                    if (!isDuplicate(sub2)) {
                        count++;
                        System.out.println("2:" + sub2);
                    }
                }
            }
            size++;
        }
        return count;
    }

    public static boolean isDuplicate(String string) {
        boolean[] exist = new boolean['z' - 'a'];
        for (int i = 0; i < string.length(); i++) {
            char c = (char) (string.charAt(i) - 'a');
            if (exist[c])
                return true;
            exist[c] = true;
        }
        return false;
    }

}