problem
- 保持队形(我们认为只要这一句内含有且恰好含有一次@,@的人和上一句话一样就算为队形)
- 若艾特的人与第一个人不同,就算队形被打破,油炸失败。若这个人在队形被打破之前出来吱声了,或者就是他打破队形了,就算(油)炸成功了。
- 若(油)炸成功,输出“Successful @某某某 attempt”,若队形被破坏第一行输出“Unsuccessful @某某某 attempt”,接下来一行输出队形第一次被破坏的行数,第三行输出第一次破坏队形的人的id。如果队形一直没被打破,就先输出“Unsuccessful @某某某 attempt”,再输出队形的长度,最后输出”Good Queue Shape”
- 总行数<50000, 每行消息长度<=1000, 文件<4MB
solution
纯字符串模拟,无话可说。
codes
#include<iostream>
#include<string>
using namespace std;
int ans;//队形长度
//find name:找说话的人名字
string findname(string b){
int w = b.find(":");
return b.substr(0,w-1);
}
//find @:找@的第一个人
string findat(string b){
if(b.find("@")==std::string::npos)return "abcd";
int w = b.find("@");
int ws = b.find("loves ",w); ws+=6;
int ok = 0;
if(b.find(" ",ws) == std::string::npos)b+=" ",ok=1;
int wt = b.find(" ",ws);
return "yyy loves "+b.substr(ws,wt-ws-ok);
}
//判断这个人@了几个人
int ats(string b){
int sum = 0;
for(int i = 0; i < b.size(); i++)
if(b[i]=='@')sum++;
return sum;
}
int main(){
string t; getline(cin,t); ans = 1;
//找第一个被@的人,即被轰炸的人的名字
string at = findat(t);
while(getline(cin,t)){
//空格字符串
int ww=0;
while(t[ww]==' ')ww++;
if(ww==(t.size()-1))break;
//破坏队形的人所在行数
ans++;
//找出当前说话的人的名字以及他@的人
string x = findname(t), y = findat(t);
//如果说话的人是被轰炸的人,说明轰炸成功,输出,程序结束
if(x == at){
cout<<"Successful @"<<at<<" attempt"<<endl;
return 0;
}
//如果这个人@了一个不是被轰炸的人或者没有@人亦或是@了不止一个人,那么视为打破队列,输出,程序结束
if(y!=at || ats(t)!=1){
cout<<"Unsuccessful @"<<at<<" attempt"<<endl;
cout<<ans<<endl<<x<<endl; return 0;
}
//如果是队形,那么长度+1
}
//如果成功到了while外面,说明轰炸失败,并且没人打破队列,输出
cout<<"Unsuccessful @"<<at<<" attempt"<<endl;
cout<<ans<<endl<<"Good Queue Shape"<<endl;
return 0;
}