#include <iostream> #include <string> using namespace std; int main() { string str; while (cin>>str) { if (str.length()<8) { cout<<"NG\n"; str.clear(); continue; } int flag = 0, count = 0; for (char cc : str) { if (cc>='0' && cc<='9') { if (!(flag&1)) { flag |= 1; count++; } } else if (cc>='A' && cc<='Z') { if (!(flag&2)) { flag |= 2; count++; } } else if (cc>='a' && cc<='z') { if (!(flag&4)) { flag |= 4; count++; } } else { if (!(flag&8)) { flag |= 8; count++; } } if (count>2) { break; } } if (count<3) { cout<<"NG\n"; str.clear(); continue; } bool rs = true; for (int i=0; i<=(str.length()-6); i++) { string tmp(str.substr(i, 3)); auto index = str.find(tmp, i+3); if (index != string::npos) { rs = false; break; } } if (rs) { cout<<"OK\n"; } else { cout<<"NG\n"; } str.clear(); } } // 64 位输出请用 printf("%lld")
判定至少包含三种字符:用整型变量flag四个位保存四种类型字符存在的情况,bit为1则表示含有,反正则没有。
判定重复子串:子串最少长度是3,只要长度为3的子串不存在重复,长度大于3的子串必不会重复。