Problem:
Score : 300 points

Problem Statement

Snuke can change a string t of length N into a string t' of length N - 1 under the following rule:

For each i (1 ≤ i ≤ N - 1), the i-th character of t' must be either the i-th or (i + 1)-th character of t.

There is a string s consisting of lowercase English letters.
Snuke's objective is to apply the above operation to s repeatedly so that all the characters in s are the same.
Find the minimum necessary number of operations.

Constraints

1 ≤ |s| ≤ 100

s consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s

Output

Print the minimum necessary number of operations to achieve the objective.

Sample Input 1

serval

Sample Output 1

3

One solution is: serval → srvvl → svvv → vvv.

Sample Input 2

jackal

Sample Output 2

2

One solution is: jackal → aacaa → aaaa.

Sample Input 3

zzz

Sample Output 3

0

All the characters in s are the same from the beginning.

Sample Input 4

whbrjpjyhsrywlqjxdbrbaomnw

Sample Output 4

8

In 8 operations, he can change s to rrrrrrrrrrrrrrrrrr.

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

#include<iostream>
#include<algorithm>
#include <string>
#include<cstdio>
#include<vector>
#include<queue>
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)
#define ci(n,retu) REP(i,n)(cin>>retu[i])
using namespace std;
typedef long long ll;

int main()
{
	ll  c, n, retu[10000] = { 0 }, themax = 848345489;
	char most, zenkai, mosto[1000];

	string a; cin >> a; zenkai = a[0];
	ll hairetuco = 0;
	ll si = a.size(), ma = -1; 
	FOR(i, 1, si) {
		/*if (a[i] == zenkai) {
			continue;
		}*/
		retu[(ll)a[i]]++;
		if (ma < retu[(ll)a[i]]) {
			ma = max(ma, retu[(ll)a[i]]);
		}
		if (ma == retu[(ll)a[i]]) {
			mosto[hairetuco] = a[i]; hairetuco++;
		}

		zenkai = a[i];
	}
	REP(j, hairetuco) {
		ll num = 0;
		most = mosto[j];
		zenkai = a[0];
		ll sa = -1;	vector<ll>keisan;
		REP(i, si) {
			if (a[i] == most) {
				num++;
				keisan.push_back(i - sa - 1);
				sa = i;
			}
		}
		sort(keisan.begin(), keisan.end());
		ll kesu = si - num, count = 0;
		//cout << most << kesu << " "<<keisan[2]<<endl;
		while (1) {
			//cout << most << endl;
			if (!kesu&&count==0) { themax = min(themax, count); break; }
			if (count == 0) { kesu++; }
			count++;
			ll soo = keisan.size();
			REP(i, soo) {
				if (keisan.front() < count) { /*cout << keisan.front() << endl;*/ keisan.erase(keisan.begin(), keisan.begin() + 1); }
				else { break; }
			}
			ll howmany = keisan.size() + 1;
		//	cout << kesu << " " << howmany << most<<endl;
			kesu -= howmany;

			if (kesu <= 0) {
				//cout << count << most << endl;
				themax = min(themax, count); break;
			}
		}
	}
	cout << themax << endl;
	return 0;
}