题解 CF21A 【Jabber ID】

Chinshyo, 2020-12-29 22:51:46

# 思路 这道题完全是一道字符串模拟的题。他的重点就在于我们如何把整个字符串 $s$ 分割成 $<username>$ , $<hostname>$ 以及 $[/resource]$ 我们不妨直接将整个输入进来的字符串 $s$ 用循环扫一遍,找到 $“@”$所在的位置。这就找到了 $<username>$。接着,我们可以将余下的部分扫一遍,如果发现有 $“.”$ ,那么就要看前一部分的长度。由于所有 $<hostname>$ 之间的**字串最长不得超过16**,所以我们就要判断前一段的字串是否合法。在结束时也要判断**整个长度不得超过32**。 # "蒟"例说明 例如本题的样例1,我们就可以分割成这样 ``` mike|@|codeforces.com ``` 当然,也不排除题目中没有的情况: ``` lbwnb|@|.com ↑ ``` $<hostname>$是**不能直接以 $ . $ 开头的** # 代码 ``` #include<bits/stdc++.h> using namespace std; int main(){ string s; cin >> s; int nw = 0;//hostname的开头元素-1 while(s[nw]!='@'){ if(isalpha(s[nw]) || isalnum(s[nw]) || s[nw] == '_') nw++; else{//不合法 cout << "NO" << endl; return 0; } } if(nw - 1 > 16 || nw - 1 < 1){//username长度是否合法 cout << "NO" << endl; return 0; } if(s.size() - nw + 1 <= 0){//hostname长度是否合法 cout << "NO" << endl; return 0; } int cnt = 0, acnt = 0, sta = -114514; for(int i = nw + 1; i < s.size(); i++){ cnt++; if(s[i] == '.'){ if(cnt <= 1 || cnt > 16){ cout << "NO" << endl; return 0; } cnt = 0; } else if(isalnum(s[i]) || isalpha(s[i]) || s[nw] == '_'){ continue; } else if(s[i] == '/'){ if(cnt < 0 || cnt > 16){ cout << "NO" << endl; return 0; } else { sta = i + 1; break; } } else { cout << "NO" << endl; return 0; } } if(sta != -114514)//确实有[/resource] for(int i = sta; i < s.size(); i++){ if(isalnum(s[i]) || isalpha(s[i]) || s[nw] == '_') continue; else { cout << "NO" << endl; return 0; } } cout << "YES" << endl; return 0; } ```