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.*;
public class Main{
  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    // 入力を取得
    int N = sc.nextInt(); //文字列長さ
    String str = sc.next(); //文字列
    String[] units = str.split("",0);
    int count=0;
    // Nまでfor文、二進変換、比較して文字列生成
    for(int i=1;i<Math.pow(2,N);i++){
      String[] bin= toBinary(i,N);
      String tempStr="";
      Set<String> setStr = new HashSet<String>();
      for(int j=0;j<N;j++){
        if(bin[j]=="1"){
          tempStr= tempStr+units[j];
          setStr.add(String.valueOf(units[j]));
        }
        // System.out.println(setStr+tempStr);
      }
      // tempStrをsetに格納、長さ比較
      if(setStr.size()==tempStr.length()){
        count++;
      }
    }
    // 出力
    System.out.println(count%((int)Math.pow(10,9)+7));
  }
  
  // 二進変換関数
  public static String[] toBinary(int num, int N){
    int count=0;
    String binaryStr[]=new String[N];
    for(int i=0;i<N;i++){
      binaryStr[i]="0";
    }
    while(true){
      count++;
      if(num%2==1){
        binaryStr[N-count]="1";
        // System.out.println(binaryStr);
      }else if(num%2==0){
        binaryStr[N-count]="0";
      }
      num=num/2;
      if(num==0){
        break;
      }
    }
    return binaryStr;
  }
}