Problem: String diversity is the number of symbols that occur in the string at least once. Diversity of s will be denoted by d(s). For example , d("aaa")=1, d("abacaba")=3.

Given a string s, consisting of lowercase Latin letters. Consider all its substrings. Obviously, any substring diversity is a number from 1 to d(s). Find statistics about substrings diversity: for each k from 1 to d(s), find how many substrings of s has a diversity of exactly k.

Input

The input consists of a single line containing s. It contains only lowercase Latin letters, the length of s is from 1 to 3·105.

Output

Print to the first line the value d(s). Print sequence t1, t2, ..., td(s) to the following lines, where ti is the number of substrings of s having diversity of exactly i.

Examples

Input

abca


Output

3
4
3
3


Input

aabacaabbad


Output

4
14
19
28
5

Note

Consider the first example.

We denote by s(i, j) a substring of "abca" with the indices in the segment [i, j].

  * s(1, 1) =  "a", d("a") = 1
  * s(2, 2) =  "b", d("b") = 1
  * s(3, 3) =  "c", d("c") = 1
  * s(4, 4) =  "a", d("a") = 1
  * s(1, 2) =  "ab", d("ab") = 2
  * s(2, 3) =  "bc", d("bc") = 2
  * s(3, 4) =  "ca", d("ca") = 2
  * s(1, 3) =  "abc", d("abc") = 3
  * s(2, 4) =  "bca", d("bca") = 3
  * s(1, 4) =  "abca", d("abca") = 3



Total number of substring with diversity 1 is 4, with diversity 2 equals 3, 3 diversity is 3.

Solution (in JAVA):

Solution:
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(System.out);
        String S = rd.readLine();
        int n = S.length();
        positions = new ArrayList[26];
        for(int i=0; i<26; i++){
            positions[i] = new ArrayList<Integer>();
        }
        for(int i=0; i<n; i++){
            int ch = (int) (S.charAt(i) - 'a');
            positions[ch].add(i);
        }
        
        long[] freq = new long[27];
        currentPos = new int[26];
        for(int i=0; i<n; i++){
            ArrayList<Integer> letterPositions = new ArrayList<Integer>();
            for(int ch=0; ch<26; ch++){
                int minimalIndex = findMinimalIndexOf(ch, i);
                if(minimalIndex==-1) continue;
                letterPositions.add(minimalIndex);
            }
            Collections.sort(letterPositions);
    //      System.out.println(i+" "+letterPositions);
            int k = letterPositions.size();
            for(int x=0; x<k; x++){
                freq[x+1] += sizeOfInterval(letterPositions.get(x), (x<k-1 ? letterPositions.get(x+1) - 1 : n - 1)); 
            }
        }
        int diver = 0;
        for(int i=26; i>=0; i--){
            if(freq[i]>0){
                diver = i;
                break;
            }
        }
        pw.println(diver);
        for(int i=1; i<=diver; i++){
            pw.println(freq[i]);
        }
        pw.flush();
        pw.close();
    }
    
    static int sizeOfInterval(int a, int b){
        if(b<a) return 0;
        return b-a+1;
    }
    
    static int findMinimalIndexOf(int ch, int afterIndex){
        if(currentPos[ch] >= positions[ch].size()) return -1; // not found
        for(int i=currentPos[ch]; i<positions[ch].size(); i++){
            int position = positions[ch].get(i);
            if(position >= afterIndex){
                currentPos[ch] = i;
                return position;
            }
        }
        currentPos[ch] = positions[ch].size();
        return -1; // not found
    }
    
    
    static ArrayList<Integer>[] positions;
    static int[] currentPos;
    
}