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: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>


int ctr[26], index[26], index_num = 0;

int accum = 0;


void trace(int product, int level, int level_num, int pos)
{
    int i;
    
    
    if(level == level_num)
    {
        accum += product;
    }
    else
    {
        for(i=pos; i<index_num && level_num-level<=index_num-i; i++)
        {
            trace(product*ctr[index[i]], level+1, level_num, i+1);
        }
    }
}

int main(void)
{
    int N;
    char *S;
    int i;
    
    
    scanf("%d", &N);
    
    S = (char*)malloc(sizeof(char)*(N+1));
    
    scanf("%s", S);
    
    
    for(i=0; i<26; i++)
    {
        ctr[i] = 0;
    }
    
    for(i=0; i<N; i++)
    {
        switch(S[i])
        {
            case 'a':
                ctr[0]++;
                break;
            case 'b':
                ctr[1]++;
                break;
            case 'c':
                ctr[2]++;
                break;
            case 'd':
                ctr[3]++;
                break;
            case 'e':
                ctr[4]++;
                break;
            case 'f':
                ctr[5]++;
                break;
            case 'g':
                ctr[6]++;
                break;
            case 'h':
                ctr[7]++;
                break;
            case 'i':
                ctr[8]++;
                break;
            case 'j':
                ctr[9]++;
                break;
            case 'k':
                ctr[10]++;
                break;
            case 'l':
                ctr[11]++;
                break;
            case 'm':
                ctr[12]++;
                break;
            case 'n':
                ctr[13]++;
                break;
            case 'o':
                ctr[14]++;
                break;
            case 'p':
                ctr[15]++;
                break;
            case 'q':
                ctr[16]++;
                break;
            case 'r':
                ctr[17]++;
                break;
            case 's':
                ctr[18]++;
                break;
            case 't':
                ctr[19]++;
                break;
            case 'u':
                ctr[20]++;
                break;
            case 'v':
                ctr[21]++;
                break;
            case 'w':
                ctr[22]++;
                break;
            case 'x':
                ctr[23]++;
                break;
            case 'y':
                ctr[24]++;
                break;
            case 'z':
                ctr[25]++;
                break;
        }
    }
    
    for(i=0; i<26; i++)
    {
        if(ctr[i] > 0)
        {
            index[index_num++] = i;
        }
    }
    
    
    for(i=1; i<=index_num; i++)
    {
        trace(1, 0, i, 0);
    }
    
    
    printf("%d\n", accum);
        
        
    free(S);

    //system("pause");
    
    return 0;
}