zoukankan      html  css  js  c++  java
  • Coder-Strike 2014

    此题题意就是匹配邮箱,提交时一直在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;
    }
  • 相关阅读:
    测试sql语句性能,提高执行效率
    js积累
    如何提高AJAX客户端响应速度
    视频代码
    网页视频播放器收集
    WinForm软件开机自动启动详细方法
    JS时间格式化函数
    (转)CSS+DIV float 定位
    CSS+DIV 布局三种定位方式
    CSS+DIV布局初练—DIV元素必须成对出现?
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3674878.html
Copyright © 2011-2022 走看看