Problem:
Score : 200 points

Problem Statement

You are given a string S of length N consisting of lowercase English letters.
We will cut this string at one position into two strings X and Y.
Here, we would like to maximize the number of different letters contained in both X and Y.
Find the largest possible number of different letters contained in both X and Y when we cut the string at the optimal position.

Constraints

2 \leq N \leq 100

|S| = N

S consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

N
S

Output

Print the largest possible number of different letters contained in both X and Y.

Sample Input 1

6
aabbca

Sample Output 1

2

If we cut the string between the third and fourth letters into X = aab and Y = bca, the letters contained in both X and Y are a and b.
There will never be three or more different letters contained in both X and Y, so the answer is 2.

Sample Input 2

10
aaaaaaaaaa

Sample Output 2

1

However we divide S, only a will be contained in both X and Y.

Sample Input 3

45
tgxgdqkyjzhyputjjtllptdfxocrylqfqjynmfbfucbir

Sample Output 3

9

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

//098 B - Cut and Count 2018/05/26

#include <bits/stdc++.h>
using namespace std;

int main(){
	int n;
	string s;cin >> n >> s;
	vector<bool> f(char('z')-char('a')+1,false);
	vector<int> _max(n,0);
	for(int i=0;i<n-1;++i){
		string x1=s.substr(0,i+1);
		string x2=s.substr(i+1,n);
		int prev=0;
		for(int j=0;j<x1.size();++j){
			for(int k=0;k<x2.size();++k){
				if(x1[j]==x2[k] && f[char('z')-char(x1[j])]==false) { ++_max[i]; f[char('z')-char(x1[j])]=true;}
			}
		}
		_max[i]=max(_max[i],prev);
		if(_max[i]>prev) prev=_max[i];
		for(int l=0;l<char('z')-char('a')+1;++l) f[l]=false;
		//cout << x1 << " " << x2 << " " << _max[i] << endl;
		
	}
	sort(_max.begin(),_max.end());
	for(int i=0;i<n;++i) cout << _max[i] << endl;
}