1. 对于至少3种类型,设置4个标志位,然后循环迭代看落到哪个区间。
  2. 对于连续长度为3的字串不能出现第二次,那就是使用string 的 find 方法,找不到会返回 npos。
  3. 程序的分模块设计思想。
#include<bits/stdc++.h>

using namespace std;


bool checksubstr(string s){// 相同长度字串不能出现两次
    // 巧用 字符串 find 方法,每三个持续往后找
    for(int i = 0; i < s.size()-3; i++){

        string tar = s.substr(i,3);
        if(s.find(tar,i+3)!=s.npos){
            return false;
        }

    }
    return true;
}


bool checkchar(string s){//包括大小写字母.数字.其它符号,以上四种至少三种
    // 检查标志位
    int i0 = 0, i1 = 0, i2 = 0, i3 = 0;
    for(int i = 0; i< s.size();i++){
        if(s[i]>='0'&&s[i]<='9'){
            i0 = 1;
        }else if(s[i]>='a'&&s[i]<='z'){
            i1 = 1;

        }else if(s[i]>='A'&&s[i]<='Z'){
            i2 = 1;
        }else{
            i3 = 1;
        }
    }

    if(i1+i2+i3+i0>=3){// 最后就是标志位加起来大于等于3
        return true;
    }

    return false;
}



int main(){
    string s;

    while(cin>>s){
        if(s.size()>8&&checksubstr(s)&&checkchar(s)){
            cout<<"OK"<<endl;
        }else{
            cout<<"NG"<<endl;
        }
    }

    return 0;
}