Problem:
Score : 400 points

Problem Statement

Given a string t, we will call it unbalanced if and only if the length of t is at least 2, and more than half of the letters in t are the same. For example, both voodoo and melee are unbalanced, while neither noon nor a is.

You are given a string s consisting of lowercase letters. Determine if there exists a (contiguous) substring of s that is unbalanced. If the answer is positive, show a position where such a substring occurs in s.

Constraints

2 ≦ |s| ≦ 10^5

s consists of lowercase letters.

Partial Score

200 points will be awarded for passing the test set satisfying 2 ≦ N ≦ 100.

Input

The input is given from Standard Input in the following format:

s

Output

If there exists no unbalanced substring of s, print -1 -1.

If there exists an unbalanced substring of s, let one such substring be s_a s_{a+1} ... s_{b} (1 ≦ a < b ≦ |s|), and print a b. If there exists more than one such substring, any of them will be accepted.

Sample Input 1

needed

Sample Output 1

2 5

The string s_2 s_3 s_4 s_5 = eede is unbalanced. There are also other unbalanced substrings. For example, the output 2 6 will also be accepted.

Sample Input 2

atcoder

Sample Output 2

-1 -1

The string atcoder contains no unbalanced substring.

Solution in C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
//using System.Diagnostics;
//using System.Linq;

class inputFile
{
	//変数
	bool b_testMode;
	List<string> list_s_line;
	int i_index;

	//コンストラクタ
	public inputFile()
	{
		//変数初期化
		b_testMode = false;
		list_s_line = new List<string>();
		i_index = 0;

		//ファイル読み込み
		read_file();
	}

	//ファイル読み込み
	void read_file()
	{
		//テストモードの場合のみ
		if (b_testMode == true)
		{
			// StreamReader の新しいインスタンスを生成する
			System.IO.StreamReader cReader =
				new System.IO.StreamReader
				(@"D:\Data\VisualStudio-workspace\paiza\inputFile.txt", Encoding.Default);

			// 読み込みできる文字がなくなるまで繰り返す
			while (cReader.Peek() >= 0)
			{
				// ファイルを 1 行ずつ読み込む
				string s_temp = cReader.ReadLine();
				// 読み込んだものを追加で格納する
				list_s_line.Add(s_temp);
			}

			// cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
			cReader.Close();
		}
	}

	//1行ずつ取得
	public string get()
	{
		//テストモードの場合
		if (b_testMode == true)
		{
			if (i_index >= list_s_line.Count)
			{
				return "";
			}

			return list_s_line[i_index++];
		}
		//本番モードの場合
		else
		{
			string s_temp = Console.ReadLine();
			if(s_temp == null || s_temp == "")
			{
				return "";
			}
			else
			{
				return s_temp;
			}
		}
	}
}

static class DeepCopyUtils
{
	public static object DeepCopy(this object target)
	{

		object result;
		BinaryFormatter b = new BinaryFormatter();

		MemoryStream mem = new MemoryStream();

		try
		{
			b.Serialize(mem, target);
			mem.Position = 0;
			result = b.Deserialize(mem);
		}
		finally
		{
			mem.Close();
		}

		return result;

	}
}

class Program
{
	//クラス変数
	static inputFile input;
	static Param PRM;

	//Main
	static void Main(string[] args)
	{
		//ファイル読み込み
		input = new inputFile();

		//データ作成
		PRM = new Param();

		//実行
		PRM.exec();
	}

	//データ作成
	[Serializable]
	class Param
	{
		//==================================================
		List<string> cl_list_s;
		//==================================================
		public Param()
		{
			//string[] a_s = input.get().Split(' ');
			//string s_result = string.Join(" ", cl_list_i_num);
			//==================================================
			//入力
			//入力は以下の形式で標準入力から与えられる。
			cl_list_s = new List<string>();
			char[] a_c = input.get().ToCharArray();
			foreach(char in_c in a_c)
			{
				cl_list_s.Add(in_c.ToString());
			}
			//==================================================
		}
		public void exec()
		{
			//==================================================
			//アンバランス判定
			bool b_unbalance = check_unbalance();

			//出力
			output(b_unbalance);
			//==================================================
		}
		//==================================================
		//出力
		void output(bool in_b_unbalance)
		{
			//s にアンバランスな部分文字列が存在しない場合は、-1 - 1 と出力せよ。
			if(in_b_unbalance == false)
			{
				Console.WriteLine("-1 -1");
			}
			//s にアンバランスな部分文字列が存在する場合は、そのような部分文字列の一つを sasa+1…sb(1≦a < b≦| s |) として、a b と出力せよ。そのような部分文字列が複数存在する場合は、いずれも正解とみなされる。
			else
			{
				//最大カウント文字
				cl_list_MOJICOUNT.Sort((a, b) => b.i_cnt - a.i_cnt);
				string s_maxCount = cl_list_MOJICOUNT[0].s_moji;

				//最大カウント文字インデックス(最初)
				int i_index_first = cl_list_s.FindIndex(aaa => aaa == s_maxCount) + 1;
				//最大カウント文字インデックス(最後)
				int i_index_last = cl_list_s.FindLastIndex(aaa => aaa == s_maxCount) + 1;

				//出力
				Console.WriteLine("{0} {1}", i_index_first, i_index_last);
			}

		}
		//アンバランス判定
		bool check_unbalance()
		{
			//文字列 t について、t の長さが 2 以上であり、
			if(cl_list_s.Count == 1)
			{
				return false;
			}

			//かつ t の中の文字のうち過半数が同じ文字であるとき、
			//t をアンバランスであると呼ぶことにします。
			//例えば、voodoo や melee はアンバランスであり、noon や a はアンバランスではありません。
			//文字カウント
			moji_count();
			//最大カウント文字数取得
			int i_max_mojiCount = get_moji_max_count();
			//過半数判定
			double d_half_mojiCount = (double)cl_list_s.Count / 2;
			if(i_max_mojiCount >= d_half_mojiCount)
			{
				//アンバランス
				return true;
			}
			else
			{
				return false;
			}
		}
		//最大カウント文字数取得
		int get_moji_max_count()
		{
			cl_list_MOJICOUNT.Sort((a, b) => b.i_cnt - a.i_cnt);

			return cl_list_MOJICOUNT[0].i_cnt;
		}
		//文字カウント
		void moji_count()
		{
			cl_list_MOJICOUNT = new List<MOJICOUNT>();
			foreach (string in_s in cl_list_s)
			{
				MOJICOUNT mc = cl_list_MOJICOUNT.Find(aaa => aaa.s_moji == in_s);
				if (mc != null)
				{
					mc.i_cnt++;
				}
				else
				{
					MOJICOUNT mc_new = new MOJICOUNT();
					mc_new.s_moji = in_s;
					mc_new.i_cnt = 1;
					cl_list_MOJICOUNT.Add(mc_new);
				}
			}
		}

		//文字カウントクラス
		List<MOJICOUNT> cl_list_MOJICOUNT;
		class MOJICOUNT
		{
			static int cls_i_no_counter = 1;

			public int i_no;
			public string s_moji { set; get; }
			public int i_cnt { set; get; }

			public MOJICOUNT()
			{
				i_no = cls_i_no_counter++;
			}
		}
		//==================================================
	}
}