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

OpenSoucre發表於2014-04-19

此題題意就是匹配郵箱,提交時一直在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;
}

 

相關文章