#include <iostream> #include <string> #include <vector> #include <unordered_map> #include <cctype> using namespace std; bool no_same_substr(const string& str) { unordered_map<string, int> last_substr_pos; //记录的int是最后一次子串的起始位置 for(int i = 0; i < str.size() - 2; ++i) { string substr = str.substr(i, 3); if(last_substr_pos.find(substr) != last_substr_pos.end()) { if(i > last_substr_pos[substr] + 2) { return false; } } else { last_substr_pos[substr] = i; } } return true; } bool has_at_least_three_type(const string& str) { int has_digit = 0, has_upper = 0, has_lower = 0, has_special = 0; for(const char& c: str) { if(isdigit(c)) has_digit = 1; else if(isupper(c)) has_upper = 1; else if(islower(c)) has_lower = 1; else has_special = 1; if(has_special + has_digit + has_lower + has_upper >= 3) { return true; } //在里面可以提前返回 } return false; } int main() { string str; vector<string> ans; while(cin >> str) { if(str.size() < 8) { ans.push_back("NG"); continue; } if(!has_at_least_three_type(str)) { ans.push_back("NG"); continue; } if(no_same_substr(str)) { ans.push_back("OK"); } else ans.push_back("NG"); } for(const string& s: ans) { cout << s << endl; } return 0; }