【Luogu1580】yyy loves Easter_Egg I(纯字符串模拟)

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;
}

猜你喜欢

转载自blog.csdn.net/qq_33957603/article/details/81259549
今日推荐