大意:模拟邮件交互。
这个题目真是一言难尽。。不是很想用string类,导致写的特别的丑,由于读取信息的数组开小了还RE了几发,感觉还是需要用一下string类的。
#include <bits/stdc++.h>
using namespace std;
set<string> addr;
int readmta()
{
char s[40],a[40];int n;
while(1)
{
scanf("%s",s);
if(s[0] == '*') break;
scanf("%s",a);
cin>>n;
while(n--)
{
cin>>s;
int slen = strlen(s);
int alen = strlen(a);
s[slen] = '@';
memcpy(s+slen+1,a,sizeof(char)*alen);
s[slen+alen+1] = '\0';
addr.insert(s);
}
}
return 0;
}
char sn[40],smta[40];
vector<string> mta;
map<string,vector<string> > mtauser;
set<string> vis1;
set<string> vis2;
int readrec()
{
vis1.clear();
vis2.clear();
char ori[40];
char rec[40],rmta[40];
while(scanf("%s",ori))
{
if(ori[0] == '*') break;
int num = 0, flag = 0;
int rlen = strlen(ori);
for(int i = 0; i <= rlen ;i++)
{
if(flag) rmta[num++] = ori[i];
if(!flag) rec[i] = ori[i];
if(ori[i] == '@')
{
rec[i] = '\0';flag = 1;
}
}
if(vis1.count(rmta) == 0)
{
vis1.insert(rmta);
mta.push_back(rmta);
if(vis2.count(ori) == 0)
{
mtauser[rmta].push_back(ori);
vis2.insert(ori);
}
}
else
{
if(vis2.count(ori) == 0)
{
mtauser[rmta].push_back(ori);
vis2.insert(ori);
}
}
}
return 1;
}
char mess[1000005];
int readmess()
{
char c;
int num = 0;
for(int i = 0; i < 5; i++)
mess[num++] = ' ';
int flag = 0;
while(c = getchar())
{
if(c == '*')
{
if(mess[num-1] == '\n' || mess[num-1] =='\r')
{
for(int i = 0; i < 5; i++)
mess[num++] = ' ';
mess[num] = '\0';
}
else
mess[num] = '\0';
break;
}
if(flag)
{
for(int i = 0; i < 5; i++)
mess[num++] = ' ';
flag = 0;
}
mess[num++] = c;
if(c == '\n' || c == '\r')
flag = 1;
}
return 0;
}
int solve()
{
for(int i = 0; i < mta.size(); i++)
{
cout << "Connection between " << smta << " and " << mta[i] << endl;
cout << " HELO "<< smta <<endl;
cout << " 250"<<endl;
cout << " MAIL FROM:<" << sn << "@" << smta << ">\n";
cout << " 250\n";
int ok = 0;
for(int j = 0; j < mtauser[mta[i]].size(); j++)
{
cout<<" RCPT TO:<"<<mtauser[mta[i]][j]<<">"<<endl;
if(addr.count(mtauser[mta[i]][j]) == 1)
{
ok = 1;
cout<<" 250\n";
}
else
cout<<" 550\n";
}
if(ok)
{
cout<<" DATA\n";cout<<" 354\n";
cout<<mess;
cout<<".\n"; cout<<" 250\n";
}
cout<<" QUIT\n";cout<<" 221\n";
}
return 1;
}
int main()
{
//freopen("D://in.txt","r",stdin);
readmta();
getchar();
int n = 1;
while(1)
{
memset(mess,'\0',sizeof(mess));
mta.clear();
mtauser.clear();
scanf("%s",sn);
if(sn[0] == '*') break;
int slen = strlen(sn);
int flag = 0;
int num = 0;
for(int i = 0; i <= slen; i++)
{
if(flag) smta[num++] = sn[i];
if(sn[i] == '@') {sn[i] = '\0';flag = 1;}
}
readrec();
char s[100];
cin.getline(s,100);
readmess();
solve();
}
return 0;
}