SRM 310 Div2 Medium InputBoxChecker

問題

電卓で数字が途中まで入力されてる。
その後数字を続けて入力して、smallest以上largest以下の数にできるか答えよ。

制約条件

smallest, largest≦20億

方針

途中まで入力された数字がsmallestまたはlargestの接頭辞になっていたら、
smallestまたはlargestを入力できるのでOK.


そうでないとき、greedyに0を末尾に付け足していって、
smallest以上largest以下になっているかを見ればいい。


言われてみると確かにそうだけどこんなの思いつかない……

ソースコード

string tos(int n){stringstream ss; ss<<n; return ss.str();}
bool ge(string a,string b){
	return a.size()<b.size()||a.size()==b.size()&&a<=b;
}

string s,l;
bool ok(int n){
	string a=tos(n);
	
	if(a.size()<=s.size()&&s.substr(0,a.size())==a||
		a.size()<=l.size()&&l.substr(0,a.size())==a)return 1;
	
	while(a.size()<=l.size()){
		if(ge(s,a)&&ge(a,l))return 1;
		a.pb('0');
	}
	return 0;
}
class InputBoxChecker {
	public:
	vector <string> checkPrefix(int smallest, int largest, vector <int> numbers) 
	{
		s=tos(smallest); l=tos(largest);
		
		vs ans;
		rep(i,numbers.size())ans.pb(ok(numbers[i])?"VALID":"INVALID");
		return ans;
	}
};