大致翻译:

对于电子邮件应用程序,您需要描述发生在成对mta之间的基于smtp的通信。发送方

的用户代理向发送消息传输代理(MTA)提供格式化的消息。发送MTA使用SimpleMail

传输协议(SMTP)与接收MTA通信。接收MTA将邮件发送到接收方的用户代理。初始化

通信链路后,发送MTA将命令行(每次一行)传输到接收MTA,接收MTA在处理每个命令

后返回一个三位数编码的响应。下面按每个消息的发送顺序显示这些发送命令。当

同一消息发送到同一MTA的多个用户时,会有多个RCPTTO行。给不同mta的用户的消

息需要单独的SMTP会话。
输入
输入包含mta的描述以及任意数量的消息。每个MTA的描述以MTA目的地及其名称(1到

15个字母数字字符)开始。在MTA名称后面是在该MTA接收邮件的用户数量和用户列表

(每个用户1到15个字母数字字符)。MTA描述以第1列中的星号结束。每条消息都以发

送用户的姓名开始,然后是收件人标识符列表。每个标识符的表单是user@mtaname

。消息(每行包含不超过72个字符)以第1列中的星号开始和结束。第1列中带有星号

而不是发送方和接收方列表的行表示整个输入的结束。
输出
对于每个消息,显示发送和接收mta之间的通信。消息中提到的每个MTA都是有效的

MTA;但是,目的地MTA可能不存在消息接收者。接收MTA通过使用550代码响应RCPT

to命令拒绝这些用户的邮件。拒绝将不影响在同一MTA向授权用户交付。如果在特定

的MTA上没有至少一个授权的收件人,则数据不会被发送。只有一个SMTP会话用于向

特定MTA的用户发送消息。例如,发送给同一MTA的5个用户的消息将只有一个SMTP会

话。同样,一条消息只针对同一用户一次。发送方联系接收mta的顺序与输入文件中

的顺序相同。如示例输出所示,在通信前加上正在通信的MTA名称,并缩进每个非空

通信行。不应打印不必要的空格。

样例输入:

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
*
*

样例输出:(中间没有空行,是截图的锅)

 #include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
using namespace std; void parse_address(const string &s,string & user,string &mta)
{
int pos = s.find('@');//从0开始
user = s.substr(, pos);//左闭右开,复制0~pos-1;
mta = s.substr(pos + );
}
int main()
{
set<string> addr;
string s,s2,user1,mta1,user2,mta2;
int n;
while (cin >> s&&s != "*")//MTA,第一个*
{
cin >> s >> n;
while (n--)
{
cin >> s2;
addr.insert(s2 + "@" + s);//Hamdy@Cairo这样存
}
}
while (cin>>s&&s!="*")//发件人收件人,数据,第五个*
{
parse_address(s, user1, mta1);//分割Hamdy@Cairo发件人 vector<string> mta;//所有需要连接的MTA(按输入顺序)
map<string, vector<string> > dest;//每个MTA需要发送的用户
//<MTA名称,用户名列表>
set<string> vis;//收件人去重 while (cin>>s2&&s2!="*")//处理收件人,第二个*
{
parse_address(s2, user2, mta2);//分割收件人
if (vis.count(s2))//重复的收件人
continue;
vis.insert(s2); if (!dest.count(mta2))
{
mta.push_back(mta2);
dest[mta2] = vector<string>();
}
dest[mta2].push_back(s2);
}
getline(cin, s2);//取数据前面的*的回车,第三个* string data;//正文数据
while (getline(cin, s2) && s2[] != '*')//第四个*
data += " " + s2 + "\n"; for (int i = ; i < mta.size(); i++)
{
string mta2;
mta2 = mta[i];
vector<string> users = dest[mta2];
cout << "Connection between " <<mta1 << " and " <<mta2 << endl;
cout << " HELO " << mta1 << "\n";
cout << "" << endl;
cout <<" MAIL FROM:<" <<s<< ">"<<endl;
cout << "" << endl; bool ok = false;
for (int j = ; j < users.size(); j++)
{
cout << " RCPT TO:<" << users[j] <<">"<< endl;
if (addr.count(users[j]))
{
ok = true;
cout << "" << endl;
}
else
cout << "" << endl;
}
if (ok)
{
cout << " DATA" << endl;
cout << "" << endl;
cout << data;
cout << " ."<<endl;
cout << "" << endl;
}
cout << " QUIT" << endl;
cout << "" << endl;
} } return ;
}

UVA 814 The Letter Carrier's Rounds的更多相关文章

  1. UVA 814 The Letter Carrier's Rounds(JAVA基础map)

    题解:就是按照题目模拟就好 但是这个题目让我发现了我Java里面许多问题 具体看代码,但是还是分为这几个方面 属性的作用域问题,缓冲区问题,map与list映射的问题,输出多个空格不一定是/t,反转思 ...

  2. The Letter Carrier's Rounds(摘)

    Description For an electronic mail application you are to describe the SMTP-based communication that ...

  3. UVa 814邮件传输代理的交互

    好吧,终于知道原来string有这么多用法,map可以通过vector来映射多个数 #include <iostream> #include <string> #include ...

  4. 紫书第5章 C++STL

    例题 例题5-1 大理石在哪儿(Where is the Marble?,Uva 10474) 主要是熟悉一下sort和lower_bound的用法 关于lower_bound: http://blo ...

  5. JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

  6. 紫书 习题8-14 UVa 1616(二分+小数化分数+精度)

    参考了https://www.cnblogs.com/dwtfukgv/p/5645446.html (1)直接二分答案.说实话我没有想到, 一开始以为是贪心, 以某种策略能得到最优解. 但是想了很久 ...

  7. 紫书 例题8-14 UVa 1607 (二分)

    题意非常难理解-- #include<cstdio> #define REP(i, a, b) for(int i = (a); i < (b); i++) using namesp ...

  8. 【习题 8-14 UVA - 1616】Caravan Robbers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 二分长度. 显然长度越长.就越不可能. 二分的时候.可以不用管精度. 直接指定一个二分次数的上限就好. 判断长度是否可行.直接用贪心 ...

  9. uva 11520 - Fill the Square

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. BeatifulSoup模块

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  2. LeetCode(99):恢复二叉搜索树

    Hard! 题目描述: 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2]   1   /  3   \   2 输出 ...

  3. input标签 disabled 和 readonly的区别

    需求描述:今天提交代码,老大审了一下,给我指出了一个改正的地方,XXX的详细信息页面(不是修改页面) input的内容是不能改的,给我指出的时候,我立马就知道了这个该怎么改了,加个readonly不就 ...

  4. 检查URL的可用性脚本

    #!/bin/bash check_url() { HTTP_CODE=$(curl -o /dev/ -s -) ];then echo "Warning: $1 Access failu ...

  5. linux 搭建testlink的问题总结

    testlink问题总结 1.要求环境centos7,安装php版本5.5以上(7.1.5),mysql5.6 ,5.7测试还不行(改变挺大的5.7表结构,字段啥的待研究),apache任意版本即可 ...

  6. PAT Basic 1071. 小赌怡情(15)

    题目内容 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注t个筹码后,计算机给出第二个数.若玩家猜对 ...

  7. CAS5.3.X 配置备忘

    ## # 普通MD5用户jdbc验证 ## #配置数据库连接 cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver cas.auth ...

  8. (转载)C#压缩解压zip 文件

    转载之: C#压缩解压zip 文件 - 大气象 - 博客园http://www.cnblogs.com/greatverve/archive/2011/12/27/csharp-zip.html C# ...

  9. js 函数参数为什么是按值传递?

    首先说下,在js中有两大类数据类型: 基本类型和引用类型. 其次,基本类型有5种: Undefined,Null,Boolean,Number.String, 引用类型有一种: Object(Func ...

  10. la 3938(未完成)

    题意:给出一个长度为n的整数序列D,你的任务是对m个询问作出回答.对于询问(a,b), 需要找到两个下标x和y,使得a≤x≤y≤b,并且Dx+Dx+1+...+Dy尽量大. 如果有多组满足条件的x和y ...