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: Accepted)

import java.util.*;
public class Main {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		String S = sc.next();
		HashMap<Character,Integer> map = new HashMap<Character,Integer>();
		int dupflag = 0;
		for(int i=0;i<N;i++) {
			char c = S.charAt(i);
			if(map.containsKey(c)) {
				map.put(c, map.get(c)+1);
				dupflag = 1;
			}
			else map.put(c, 1);
		}
		long M = (long) (Math.pow(10, 9)+7);
		long a = 1;
		long b = 1;
		int sum = 0;
		long mult = 1;
		for(int i=0;i<N;i++) {
			a = (a*2) % M;
		}
		if(dupflag == 1) {
			for(int x : map.values()) {
				if(x==1) continue;
				sum += x;
				mult = (mult * (x+1)) % M;
				for(int i=0;i<x;i++) {
					b = (b*2) % M;
				}
			}
			if(b-mult <0) b = M+b-mult;
			else b = b-mult;
			for(int i=0;i<N-sum;i++) {
				b = (b*2)%M;
			}
		}
		else b = 0;
		//System.out.println(a + " " + b);
		if(a-1-b<0) System.out.println(M+a-1-b);
		else System.out.println(a-1-b);
	}
	
}