SRM309 div2 medium

わりとむずい。
わかれば、あぁ、そういうことか、となる。

604
10200 なら、
lo:6  60  604
hi:1  10  102  1020  10200みたいにしたあと、
適当な処理をして、
lo:6  60  604
hi:10 102 10200
みたいにする。
あとは与えられた数を当てはめていくだけ.

あるいは、
small = 604
a[i] = 65 とかのとき、 65 -->654 とかにしても全く求められるものは一緒なので、
string型にして変形する。
654がlargeより小さければVALIDになる。
class InputBoxChecker {
public:
  vector <string> checkPrefix(int smallest, int largest, vector <int> numbers) {
    vector<int> lower; vector<int> upper;
    for(int i = 0; ; i++) {
      bool flag = false;
      if(smallest != 0) {
	lower.push_back(smallest); flag = true;
      }
      if(largest != 0) {
	upper.push_back(largest); flag = true;
      }
      if(!flag) break;
      smallest /=10;
      largest /=10;
    }
    reverse(lower.begin(), lower.end()); reverse(upper.begin(), upper.end());
    if(lower[0] > upper[0]) upper.erase(upper.begin());
    if(lower.size() < upper.size() ) {
      upper[lower.size()-1] = upper[upper.size()-1];
    }

    int sz = numbers.size();
    vector<string> ans(sz);
    for(int i = 0; i < sz; i++) {
      bool flag = false;
      for(int j = 0; j < lower.size(); j++) {
	if(lower[j] <= numbers[i] && upper[j] >= numbers[i]) {
	  flag = true; break;
	}
      }
      ans[i] = (flag) ? "VALID" : "INVALID";
    }
    return ans;
    
  }
string StoInt(int num) {
	stringstream ss;
	ss << num;
	return ss.str();
}
int inttoS(string str) {
	int num;
	sscanf(str.c_str(), "%d", &num);
	return num;
}
class InputBoxChecker {
public:
  vector <string> checkPrefix(int smallest, int largest, vector <int> numbers) {
    int sz = numbers.size();
    vector<string> ans(sz);
		string small = StoInt(smallest); int len = small.size();
    for(int i = 0; i < sz; i++) {
      string tmp = StoInt(numbers[i]);
			if(len > tmp.size() ) {
				tmp += small.substr(tmp.size() );
			}
			numbers[i] = inttoS(tmp);
      ans[i] = (numbers[i] >= smallest && numbers[i] <= largest) ? "VALID" : "INVALID";
    }
    return ans;
  }