一道题干特别复杂的题,模拟邮件的发送,把每一个地址保存下来, 然后在搜索能否找到匹配的地址。逻辑并不复杂就是输出输入格式有点绕。
#include<iostream> #include<string> #include<vector> #include<set> #include<map> using namespace std; void parse_address(const string& s, string &user, string& mta){ int k=s.find('@'); user=s.substr(0,k); mta=s.substr(k+1); } int main(){ int k; string s,t,user1,mta1,user2,mta2; set<string> addr; //输入所有MTA,转化为地址列表 while(cin>>s && s!="*"){ cin>>s>>k; while(k--){ cin>>t; addr.insert(t+"@"+s);} } while(cin>>s && s!="*"){ parse_address(s,user1,mta1);//处理发件人地址 vector<string> mta;//所有需要连接的mta,按照输入顺序 map<string, vector<string> > dest;//每个MTA需要发送的用户 set<string> vis; while(cin>>t && t!="*"){ parse_address(t,user2,mta2);//处理收件人地址 if(vis.count(t)) continue;//重复的收件人 vis.insert(t); if(!dest.count(mta2)){ mta.push_back(mta2); dest[mta2]=vector<string>(); } dest[mta2].push_back(t); } getline(cin,t);//把'*'这一行的回车吃掉 //输入文件正文 string data; while(getline(cin,t) && t[0]!='*') data+=" "+t+" "; for(int i=0;i<mta.size();i++){ string mta2=mta[i]; vector<string> users=dest[mta2]; cout<<"Connection between "<<mta1<<" and "<<mta2<<endl; cout<<" HELO "<<mta1<<" ";cout<<" 250 "; cout<<" MAIL FROM:<"<<s<<"> ";cout<<" 250 "; bool ok=false; for(int i=0;i<users.size();i++){ cout<<" RCPT TO:<"<<users[i]<<"> "; if(addr.count(users[i])){ok=true;cout<<" 250 ";} else cout<<" 550 "; } if(ok){ cout<<" DATA ";cout<<" 354 "; cout<<data; cout<<" . ";cout<<" 250 "; } cout<<" QUIT ";cout<<" 221 "; } } return 0; }