zoukankan      html  css  js  c++  java
  • The Letter Carrier's Rounds(摘)

    Description

    For an electronic mail application you are to describe the SMTP-based communication that takes place between pairs of MTAs. The sender's User Agent gives a formatted message to the sending Message Transfer Agent (MTA). The sending MTA communicates with the receiving MTA using the Simple Mail Transfer Protocol (SMTP). The receiving MTA delivers mail to the receiver's User Agent. After a communication link is initialized, the sending MTA transmits command lines, one at a time, to the receiving MTA, which returns a three-digit coded response after each command is processed. The sender commands are shown below in the order sent for each message. There is more than one RCPT TO line when the same message is sent to several users at the same MTA. A message to users at different MTAs requires separate SMTP sessions. 
    HELO myname Identifies the sender to the receiver (yes, there is only one L). MAIL FROM:<sender> Identifies the message sender RCPT TO:<user> Identifies one recipient of the message DATA Followed by an arbitrary number of lines of text comprising the message      body, ending with a line containing a period in column one. QUIT Terminates the communication.
    The following response codes are sent by the receiving MTA: 
    221 Closing connection (after QUIT) 250 Action was okay (after MAIL FROM and RCPT TO specifying an acceptable user, or completion of a message) 354 Start sending mail (after DATA) 550 Action not taken; no such user here (after RCPT TO with unknown user)

    Input

    The input contains descriptions of MTAs followed by an arbitrary number of messages. Each MTA description begins with the MTA designation and its name (1 to 15 alphanumeric characters). Following the MTA name is the number of users that receive mail at that MTA and a list of the users (1 to 15 alphanumeric characters each). The MTA description is terminated by an asterisk in column 1. Each message begins with the sending user's name and is followed by a list of recipient identifiers. Each identifier has the form user@mtaname. The message (each line containing no more than 72 characters) begins and terminates with an asterisk in column 1. A line with an asterisk in column 1 instead of a sender and recipient list indicates the end of the entire input.

    Output

    For each message, show the communication between the sending and receiving MTAs. Every MTA mentioned in a message is a valid MTA; however, message recipients may not exist at the destination MTA. The receiving MTA rejects mail for those users by responding to the RCPT TO command with the 550 code. A rejection will not affect delivery to authorized users at the same MTA. If there is not at least one authorized recipient at a particular MTA, the DATA is not sent. Only one SMTP session is used to send a message to users at a particular MTA. For example, a message to 5 users at the same MTA will have only one SMTP session. Also a message is addressed to the same user only once. The order in which receiving MTAs are contacted by the sender is unspecified. As shown in the sample output , prefix the communication with the communicating MTA names, and indent each communication line.

    Sample Input

    MTA London 4 Fiona Paul Heather Nevil
    MTA SanFrancisco 3 Mario Luigi Shariff 
    MTA Paris 3 Jacque Suzanne Maurice
    MTA HongKong 3 Chen Jeng Hee
    MTA MexicoCity 4 Conrado Estella Eva Raul
    MTA Cairo 3 Hamdy Tarik Misa
    *
    Hamdy@Cairo Conrado@MexicoCity Shariff@SanFrancisco Lisa@MexicoCity
    *
    Congratulations on your efforts !!
    --Hamdy
    *
    Fiona@London Chen@HongKong Natasha@Paris
    *
    Thanks for the report!  --Fiona
    *
    *
    

    Sample Output

    Connection between Cairo and MexicoCity
         HELO Cairo
         250
         MAIL FROM:<Hamdy@Cairo>
         250
         RCPT TO:<Conrado@MexicoCity>
         250
         RCPT TO:<Lisa@MexicoCity>
         550
         DATA
         354
         Congratulations on your efforts !!
         --Hamdy
         .
         250
         QUIT
         221
    Connection between Cairo and SanFrancisco
         HELO Cairo
         250
         MAIL FROM:<Hamdy@Cairo>
         250
         RCPT TO:<Shariff@SanFrancisco>
         250
         DATA
         354
         Congratulations on your efforts !!
         --Hamdy
         .
         250
         QUIT
         221 
    Connection between London and HongKong
         HELO London
         250
         MAIL FROM:<Fiona@London>
         250
         RCPT TO:<Chen@HongKong>
         250
         DATA
         354
         Thanks for the report!  --Fiona
         .
         250
         QUIT
         221
    Connection between London and Paris
         HELO London
         250
         MAIL FROM:<Fiona@London>
         250
         RCPT TO:<Natasha@Paris>
         550
         QUIT
         221

     

     

    就是数据太复杂,对于stl中容器的应用很生疏,没啥思维难点

    以下程序的亮点:

        用一个string字符串data存储两三行的邮件

     

     

    #include<iostream>
    #include<map>
    #include<string>
    #include<vector>
    #include<set>
    using namespace std;
    
    void parse_address(const string&s,string& user,string&mta)
    {
        int k=s.find('@');
        user=s.substr(0,k);            //将user1@mta1 分解开来
        mta=s.substr(k+1);
    }
    int main()
    {
        int n;
        string s,t,user1,mta1,user2,mta2;
        set<string>address;
        
        while(cin>>s&&s!="*"){                //mta下的用户信息
            cin>>s>>n;
            while(n--){
                cin>>t;
                address.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向量中没有该mta就插入并将向量与map中的string mta对应起来
                    mta.push_back(mta2);
                    dest[mta2]=vector<string>();
                }
                dest[mta2].push_back(t);        //插入user@mta 完整形式
            }
            getline(cin,t);               //吃掉"*"
    
            string data;
            while(getline(cin,t)&&t[0]!='*')data+="  "+t+"
    ";      //将整个邮件存入一个字符串data中
    
            //cout<<"***"<<data<<"***"<<endl;
            for(int i=0;i<mta.size();i++){
                string mta2=mta[i];
                vector<string>users=dest[mta2];                 //users即为dest[mata2],mata2对应的需要发送的用户
                cout<<"Connection between "<<mta1<<" and "<<mta2<<endl;
                cout<<"  HELO "<<mta1<<"
    ";
                cout<<"  250
    ";
                cout<<"  MALL FROM:<" <<s<<">
    ";
                cout<<"  250
    ";
                bool ok=false;
                for(int i=0;i<users.size();i++){
                    cout<<"RCPT TO:<"<<users[i]<<">
    ";
                    if(address.count(users[i])){
                        ok=true;
                        cout<<"  250
    ";
                    }
                    else cout<<"  500
    ";
                }
                if(ok){
                    cout<<"  DATA
    ";
                    cout<<"  254
    ";
                    cout<<data;
                    cout<<".
    ";
                    cout<<"  250
    ";
                }
                cout<<"  QUIT
    ";
                cout<<"  221
    ";
            }
        }
        //system("pause");
        return 0;
    }

     

  • 相关阅读:
    把你的名字刻到IE上
    C#格式化字符串
    CEO、COO、CFO、CTO、CIO
    Net通用分页(可以选择页码的显示,且有中英选择)
    laravelmiddleware中间件常用使用方法
    laravel路由组中namespace的的用法详解
    qq自己设定动态图像视屏
    laravel实现excel表的导入导出功能
    git创建远程分支并推送
    jquery如何用Ajax将信息遍历到界面上
  • 原文地址:https://www.cnblogs.com/farewell-farewell/p/5330702.html
Copyright © 2011-2022 走看看