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 C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>//random,NULL
#include <string.h>
#include <time.h>
#include <unistd.h>//sleep()
#include <math.h>
#include <stdbool.h>

#define rep(i,n) for(int i=0; i<((int)n); i++)
#define REP(i,n) for(int i=0; i<=((int)n); i++)
#define srep(i,a,n) for(int i=a; i<((int)n); i++)
#define SREP(i,a,n) for(int i=a; i<=((int)n); i++)
#define rrep(i,n) for(int i=n-1; i>=0; i--)
#define RREP(i,n) for(int i=n; i>=0; i--)
#define INF 1000000000


long dfs(int N, int index, char *s, unsigned int S){
  //printf("index = %d, s[index] = %c\n", index, s[index]);
  if(index==N){
    return 1;
  }

  int n=s[index]-'a';
  long res;

  if(S&(1<<n)){
    //printf("1\n");
    res=dfs(N, index+1, s, S);
  }

  else{
    //
    long res1=dfs(N, index+1, s, S);

    S|=(1<<n);
    long res2=dfs(N, index+1, s, S);

    res=res1+res2;
  }

  return res;
}


int main(){
  char buf[100010];
  int N;

  fgets(buf,sizeof(buf),stdin);
  sscanf(buf, "%d", &N);

  char *s=(char *)malloc(sizeof(char)*N);

  fgets(buf,sizeof(buf),stdin);
  sscanf(buf, "%s", s);

  long ans=dfs(N, 0, s, 0)-1;

  printf("%ld\n", ans%(1000000007));

  return 0;
}