您的位置:首页 > 大数据 > 人工智能

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

2014-04-19 12:59 309 查看
此题题意就是匹配邮箱,提交时一直在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: