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