CodeForces 21A 题解
题解笔记
CF21A Jabber ID(ID.cpp)
时间限制 \(0.5s\) | 内存限制 \(256M\)
题目描述:
一个地址由 <username>@<hostname>/<resource>
组成,其中/<resource>
可以被省略。
<username>
字段允许大写、小写字母,数字、下划线,其长度应在1到16。
<hostname>
字段允许用.来分隔。每一段的要求同
<resource>
字段要求同<username>
字段。 给出一个地址,询问是否合法。
输入格式:
仅有一行,包含一个字符串,表示一个地址(保证所有字符的 ASCII 值在 \(33\) 到 \(127\) 间),地址总长度不超过 \(100\) 字符。
输出格式:
一行,如果合法输出 YES
,否则输出 NO
。
输入输出样例:
样例1输入 | 样例1输出 | 样例2输入 | 样例2输出 |
---|---|---|---|
mike@codeforces.com | YES | john.smith@codeforces.ru/contest.icpc/12 | NO |
解题思路:
一道中等码量的模拟题,直接将字符串划分成三种区域,然后对于每种区域再按照题目条件判断即可。
参考代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[1000];
char s[100][100];
int main()
{
scanf("%s",str);
int len = strlen(str);
bool f1 = 0;
bool f2 = 1;
int k = 0, i;
for( i=0; i<len; i++ )
{
if(str[i] == '@')
{
f1 = 1;
break;
}
else
{
if(!((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z') ||(str[i]>='0'&&str[i]<='9')|| str[i] == '_'))
{
f2 = 0;
break;
}
else k++;
if(k > 16)
{
f2 = 0;
break;
}
}
}
if(f1 == 0 || f2 == 0 || k < 1)
{
printf("NO\n");
return 0;
}
k = 0;
int k2 = 0;
for( i=i+1; i<len; i++ )
{
if(str[i] == '/') break;
else if(str[i] == '.')
{
if(k2 == 0)
{
f2 = 0;
break;
}
k2 = 0;
continue;
}
else
{
if(!((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')||(str[i]>='0'&&str[i]<='9') || str[i] == '_'))
{
f2 = 0;
break;
}
else k++, k2++;
if(k2 > 16 || k > 32)
{
f2 = 0;
break;
}
}
}
if(f2 == 0 || k2 == 0 || k == 0)
{
printf("NO\n");
return 0;
}
if(i == len)
{
printf("YES\n");
return 0;
}
k = 0;
for( i=i+1; i<len; i++ )
{
if(str[i] == '/')
{
if(k == 0)
{
f2 = 0;
break;
}
k = 0;
continue;
}
else
{
if(!((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')||(str[i]>='0'&&str[i]<='9') || str[i] == '_'))
{
f2 = 0;
break;
}
else k++;
if(k > 16)
{
f2 = 0;
break;
}
}
}
if(!f2 || !k) printf("NO\n");
else printf("YES\n");
return 0;
}