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; }