Coder-Strike 2014 - Round 1 E. E-mail Addresses

此题题意就是匹配邮箱,提交时一直在test 14上WA,看了测试用例之后才发现计数用的int溢出,要用long long还是做题经验不够,导致此题未能通过,以后一定要考虑数据量大小

题意是找出邮件地址的数量,永许出现相同的地址

此题最重要的部分是要注意邮件地址的构成规则

1、邮件开始部分必须是字母串,数字和‘_’,但必须以字母开头

2、必须有字符‘@’

3、接着是非空的字母或数字

4、接着是必须有‘.’

5、地址必须以非空的字母串结束,不能含有数字,'_',和'.'

本题的想法是先按照@对字符串进行分割,存入到vector<string>

然后第i个字符串作为邮件的开头,第i+1个字符串作为邮件结尾 ( 邮件=开头@结尾

然后统计构成邮件开头的数量(注意邮件开头是以字母开头)

  1、遇到‘.’,计数规0

  2、遇到字母计数加1

     3、遇到数字和‘_’计数不变

然后统计构成邮件结尾的数量

  1、在未遇到‘.’之前遇到非数字和字母则为不合法邮件

  2、遇到'.'开始计数

  3、在开始计数后,遇到‘.’,分为两种情况

      1、开始计数后马上就遇到'.',如a@b..cc,则为不合法邮件停止计数

      2、之后才遇到,如a@b.adc.com 则停止计数

  4、开始计数后遇到非字母字符停止计数

然后将邮件开头的数量乘以邮件结尾的数量即为合法邮件的数量

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <cctype>
#include <sstream>
using namespace std;

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}


std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, elems);
    return elems;
}

long long countHeadAddress(string& str){
    long long  cnt = 0;
    for(int i = 0 ; i < str.length(); ++ i){
        if(str[i] == '.') cnt = 0;
        else if(islower(str[i])){
            cnt++;
        }
    }
    return cnt;
}

long long countTailAddress(string& str){
    long long cnt = 0;
    bool flag = false;
    for(int i = 0 ; i < str.length(); ++ i){
        if(!flag){
            if(i == 0 && str[i] == '.') break;
            if(str[i]=='.') flag=true;
            else if(islower(str[i]) || (str[i]>='0'&&str[i] <='9')){

            }
            else break;
        }else{
            if(islower(str[i])){
                cnt++;
            }else break;
        }
    }
    return cnt;
}

int main(){
    string saveStr;
    cin >>  saveStr;
    vector<string> letter= split(saveStr,'@');
    long long cnt = 0;
    for(int i = 0 ; i < letter.size()-1; ++ i){
        cnt+=countHeadAddress(letter[i])*countTailAddress(letter[i+1]);
    }
    cout<<cnt<<endl;
}

 

posted @ 2014-04-19 12:59  OpenSoucre  阅读(253)  评论(0编辑  收藏  举报