[工程师死绝的世界C3002]機械の総合病院 翻译及题解
机械综合医院
Translation by KSkun
原题:問題「機械の総合病院」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜
问题描述
你在分析PAIZA医院的系统。
为了避免被非法入侵,医院系统的用户密码应该达到一定的强度。
PAIZA医院的系统要求用户密码满足以下的强度要求:
- 长度不低于6
- 必须包含英文字母和数字
- 同一字符不得连续出现3次或以上
密码中,不区分英文字符的大小写。
如果密码满足以上强度要求,输出Valid
,否则输出Invalid
。
例如,样例1中的密码7Caaad9
满足条件1和2,但是不满足条件3,因为aaa
这里连续出现了3个a
字符。
输入格式
t
- 给出表示密码的字符串t。
- 在输入的最后,包含一个换行符。
输出格式
如果密码满足以上强度要求,输出Valid
,否则输出Invalid
。
条件
- 1 ≦ t的长度 ≦ 30
- 字符串t只包含半角英文字符及半角数字
输入输出样例
输入输出样例1
输入:
7Caaad9
输出:
Invalid
输入输出样例2
输入:
DjZGrduN8Mj4
输出:
Valid
题解
// Code by KSkun, 2019/1
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
typedef long long LL;
inline char fgc() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
? EOF : *p1++;
}
inline LL readint() {
LL res = 0, neg = 1; char c = fgc();
for(; !isdigit(c); c = fgc()) if(c == '-') neg = -1;
for(; isdigit(c); c = fgc()) res = res * 10 + c - '0';
return res * neg;
}
inline char readsingle() {
char c;
while(!isgraph(c = fgc())) {}
return c;
}
char t[35];
bool hasalpha = false, hasdigit = false;
int main() {
scanf("%s", t + 1);
int n = strlen(t + 1);
if(n < 6) {
puts("Invalid"); return 0;
}
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(isupper(t[i])) t[i] = tolower(t[i]);
if(isalpha(t[i])) hasalpha = true;
if(isdigit(t[i])) hasdigit = true;
if(t[i] != t[i - 1]) cnt = 1;
else cnt++;
if(cnt >= 3) {
puts("Invalid"); return 0;
}
}
if(!hasalpha || !hasdigit) {
puts("Invalid"); return 0;
}
puts("Valid");
return 0;
}