题解 | #密码验证合格程序#
密码验证合格程序
http://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
- 可以使用位运算记录字符种类
- 判断是否含有重复子串的时候,只需要判断长度为3的子串即可。
#include<bits/stdc++.h> using namespace std; inline bool SubStringDetermine(string s) { unordered_map<string, int> hash; // i : length of sub string //for (int len = 3; len < s.size() - 1; len++) int len = 3; { for (int i = 0; i < s.size() - len + 1; i++) { string sub = s.substr(i, len); hash[sub] = hash[sub] + 1; if (hash[sub] > 1) return false; } } return true; } inline int lowbit(int x) { return x & (-x); } inline bool TypeDetermine(string s) { int cnt = 0; for (auto c : s) { if (isupper(c)) cnt |= 1; else if (islower(c)) cnt |= (1 << 1); else if (isdigit(c)) cnt |= (1 << 2); else cnt |= (1 << 3); } // count 1 int type = 0; for (; cnt; cnt -= (lowbit(cnt))) type++; return type >= 3; } inline bool SizeDetermine(string s) { return s.size() > 8; } int main() { cin.tie(nullptr)->sync_with_stdio(false); string s; for (;getline(cin, s);) { if (SizeDetermine(s) && TypeDetermine(s) && SubStringDetermine(s)) cout << "OK" << endl; else cout << "NG" << endl; } return 0; }