SGU 274 Spam-filter

题意:

按照给定的条件判断给出的邮箱地址是否合法。



Solution:

模拟。需要注意输入中可能包含空格。

空串不能作为symbol,因此prefix也不能包含连续和出现在首尾的‘.‘

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
string s;
bool symbol (char c) {
    return c == ‘_‘ || (c >= ‘0‘ && c <= ‘9‘) || (c >= ‘a‘ && c <= ‘z‘) || (c >= ‘A‘ && c <= ‘Z‘) || c == ‘-‘;
}
bool prefix (string s) {
    if (s.size() == 0) return 0;
    for (int i = 0, cnt = 0; i < s.size(); ++i) {
        if (s[i] == ‘.‘) {
            if ( i == 0 || i == s.size() - 1) return 0  ;
            else if (s[i + 1] == ‘.‘ || s[i - 1] == ‘.‘) return 0;
        }
        else if (!symbol (s[i]) ) return 0;
    }
    return 1;
}
int main() {
    cin >> n;
    getchar();
    while (n--) {
        getline (cin, s);
        bool ok = 1;
        int p = s.find (‘@‘);
        if (p >= 0) {
            string t (s, 0, p);
            s.assign (s, p + 1, s.size() );
            if (!prefix (t) ) ok = 0;
            p = s.rfind (‘.‘);
            if (p >= 0 && ok) {
                string t (s, 0, p);
                s.assign (s, p + 1, s.size() );
                if (!prefix (t) ) ok = 0;
                if (s.size() < 2 || s.size() > 3) ok = 0;
                for (int i = 0; i < s.size() && ok; ++i) {
                    if (! ( (s[i] >= ‘a‘ && s[i] <= ‘z‘) || (s[i] >= ‘A‘ && s[i] <= ‘Z‘) ) ) ok = 0;
                }
            }
            else ok = 0;
        }
        else ok = 0;
        if (ok) puts ("YES");
        else puts ("NO");
    }
}

时间: 2024-09-30 00:27:29

SGU 274 Spam-filter的相关文章

codeforces Gym 100338F Spam Filter

阅读题, 概要:给出垃圾邮件和非垃圾邮件的集合,然后按照题目给出的公式计算一个单词是不是垃圾邮件的单词 ,那个公式化简一下就是在垃圾邮件中出现的次数和在总次数的比值,大于二分之一就算是. 如果一个邮件里的垃圾邮件的单词出现次数超过给定比例就算是垃圾邮件. 需要注意的地方是:一个邮件里单词只能统计一次. 因为sstream会很慢,容易T,所以手写了一个类似的sstream的函数 #include<bits/stdc++.h> using namespace std; typedef long d

转:Python标准库(非常经典的各种模块介绍)

Python Standard Library 翻译: Python 江湖群 10/06/07 20:10:08 编译 0.1. 关于本书 0.2. 代码约定 0.3. 关于例子 0.4. 如何联系我们 核心模块 1.1. 介绍 1.2. _ _builtin_ _ 模块 1.3. exceptions 模块 1.4. os 模块 1.5. os.path 模块 1.6. stat 模块 1.7. string 模块 1.8. re 模块 1.9. math 模块 1.10. cmath 模块

7.2.5指定超类

就像本章前面我们讨论的一样,子类可以扩展超类的定义.将其他类名写在class语句后的圆括号内可以指定超类: class Filter: def init(self): self.blocked =[] def filter(self,sequence): return[x for x in sequence if x not in self.blocked] class SPAMFilter(filter):#SPAMFilter是Filter的子类 def init(self):#重写Filt

python之抽象二

多态:意味着可以对不同类的对象使用同样的操作 封装:对外部世界隐藏对象的工作细节 继承:以普通的类为基础建立专门的类对象 def getPrice(object): if isinstance(object,tuple): return object[1] else: return magic_network_method(object) 这里用isinstance进行类型/类检查是为了说明一点-----类型检查一般说来并不是什么好方法,能不用则不用. 前面的代码中使用isinstance函数查

十八款开源/商用的Linux服务器控制面板

当站长同时拥有很多网站站点,不通过控制面板管理各种网站就会非常困难.但是为了满足不同需求,我们需要个性化的方案. 网站控制台是完全网页接口可以通过一个网址来管理你各项网络服务的软件.控制台程序可以管理电子邮件账号,FTP账号,文件管理和创建子站,监控磁盘空间和带宽,创建备份等等. 网站控制面板对于Linux新手来讲是个出色的解决方案.可以用来管理虚拟主机或者专用主机上众多的站点.这种站点控制面板可以让网站管理管理变得不需要太多专业知识. 最著名和强大的控制面板是cPanel和 Plesk.这两个

Chapter1——机器学习绪论

第一章的主要目的是为了了解一下基本概念,如什么是机器学习.无监督学习.监督学习等等. 一.什么是机器学习 1.机器学习是一门新的研究领域,主要是指在不需要显示编程情况下,计算机具有学习的能力 Field of study that gives computers the ability to learn without being explicitly programmed——Arthur Samuel (1959) 2.A computer program is said to learn f

异步任务利器Celery(二)在django项目中使用Celery

Celery 4.0支持django1.8及以上的版本,低于1.8的项目使用Celery 3.1. 一个django项目的组织如下: - proj/ - manage.py - proj/ - __init__.py - settings.py - urls.py 首先建立proj/proj/celery.py文件: from __future__ import absolute_import, unicode_literals import os from celery import Cele

python基础教程_学习笔记9:抽象

抽象 懒惰即美德. 抽象和结构 抽象可以节省大量工作,实际上它的作用还要更大,它是使得计算机程序可以让人读懂的关键. 创建函数 函数可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> import math >>> y=1 >>> x=math.sqrt >>> callable(x) True >>> callab

python基础教程(八)

创建自已的对象(类)是python非常核心的概念,事实上,python被称为面向对象语言,本章会介绍如何创建对象.以及面向对象的概念:继承.封装.多态. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. 多态 面向对象程序设计最有趣的特性是多太,它是是让大多数人犯晕的特性.所以,先来介绍这个. 多态意思是"有多种形式".多态意味着就算不知道变量所引用的对象类是什么,还是能对它进行操作,而它也会根据对象(或类)类型的