Problem:
Score : 700 points

Problem Statement

We have a string s consisting of lowercase English letters.
Snuke is partitioning s into some number of non-empty substrings.
Let the subtrings obtained be s_1, s_2, ..., s_N from left to right. (Here, s = s_1 + s_2 + ... + s_N holds.)
Snuke wants to satisfy the following condition:

For each i (1 \leq i \leq N), it is possible to permute the characters in s_i and obtain a palindrome.

Find the minimum possible value of N when the partition satisfies the condition.

Constraints

1 \leq |s| \leq 2 \times 10^5

s consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s

Output

Print the minimum possible value of N when the partition satisfies the condition.

Sample Input 1

aabxyyzz

Sample Output 1

2

The solution is to partition s as aabxyyzz = aab + xyyzz.
Here, aab can be permuted to form a palindrome aba, and xyyzz can be permuted to form a palindrome zyxyz.

Sample Input 2

byebye

Sample Output 2

1

byebye can be permuted to form a palindrome byeeyb.

Sample Input 3

abcdefghijklmnopqrstuvwxyz

Sample Output 3

26

Sample Input 4

abcabcxabcx

Sample Output 4

3

The solution is to partition s as abcabcxabcx = a + b + cabcxabcx.

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Time Limit Exceeded)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String input = br.readLine();
		int len = input.length();
		
		int result = solve(input);
		System.out.println(result);
	}
	
	static int solve(String str){
		if(isPalindon(str)){
//			System.out.println("palindon!");
			return 1;
		}
		
		int len = str.length();
		
		int used = usedCharType(str);
		if(used == 1){
			return 1;
		}
		else if(used == len){
			return used;
		}
		
		
		
		int result = Integer.MAX_VALUE;
		for(int i = 1; i < len; i++){
			String str1 = str.substring(0, i);
			String str2 = str.substring(i, len);
			int tmp = solve(str1) + solve(str2);
			
			if(tmp < result){
//				System.out.println("str "+str+" str1 "+str1+" str2 "+str2+" i "+i+" tmp "+tmp);
				result = tmp;
				if(result == 2){
					return result;
				}
			}
		}
		
		return result;
	}
	
	static int usedCharType(String str){
		char[] alpha = new char[26];
		
		int len = str.length();
		for(int i = 0; i < len ; i++){
			alpha[str.charAt(i)-'a']++;
		}
		
		int used = 0;
		for(int i = 0; i < 26; i++){
			if(alpha[i] > 0){
				used++;
			}
		}
		
		return used;
	}
	
	static boolean isPalindon(String str){
		char[] alpha = new char[26];
		
		int len = str.length();
		for(int i = 0; i < len ; i++){
			alpha[str.charAt(i)-'a']++;
		}
		
		int odd = 0;
		for(int i = 0; i < 26; i++){
			if(alpha[i] % 2 == 1){
				odd++;
				if(odd >= 2){
					return false;
				}
			}
		}
		
		return true;
	}

}