[洛谷1580]yyy loves Easter_Egg I 题解

[洛谷1580]yyy loves Easter_Egg I 题解

题目地址:洛谷:【P1580】yyy loves Easter_Egg I – 洛谷

题目描述

yyy loves OI(Huntfire),yyy loves Maths(redbag),yyy loves Chemistry(absi2011)对yyy loves Physics(soha)进行轮番炸,轰炸按照顺序进行,顺序为Huntfire,redbag,absi2011。
现在这一题中吗,我们不考虑太复杂的队形形式。我们认为只要这一句内含有且恰好含有一次@,@的人和上一句话一样就算为队形。
比如以下也视为队形

yyy loves OI : @yyy loves Microelectronic
yyy loves Maths : @yyy loves Microelectronic 我佩服soha的出题效率
yyy loves OI : @yyy loves Microelectronic +1
yyy loves Chemistry : +1 @yyy loves Microelectronic

若艾特的人与第一个人不同,就算队形被打破。若这个人在队形被打破之前出来吱声了,或者就是他打破队形了,就算(油)炸成功了。若(油)炸成功,输出“Successful @某某某 attempt”,若队形被破坏先输出“Unsuccessful @某某某 attempt”,再输出队形第一次被破坏的行数与第一次破坏队形的人的id。如果队形一直没被打破,就先输出“Unsuccessful @某某某 attempt”,再输出队形的长度,最后输出”Good Queue Shape”/* yyy loves Microelectronic 是kkksc03*/

输入输出格式

输入格式:
N行,为轰炸开始后的一段消息记录,每行一条消息。消息格式:“消息发送者 + ‘ : ’+消息内容”,每行消息长度不超过1000。(中文用拼音代替了)

输出格式:
若(油)炸成功,输出“Successful @某某某 attempt”,若队形被破坏第一行输出“Unsuccessful @某某某 attempt”,接下来一行输出队形第一次被破坏的行数,第三行输出第一次破坏队形的人的id,如果队形一直没被打破,就先输出“Unsuccessful @某某某 attempt”,再输出队形的长度,最后输出”Good Queue Shape”

输入输出样例

输入样例#1:

yyy loves OI : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Maths : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Chemistry : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Microelectronic : ni men wu liao me 
yyy loves OI : @yyy loves Physics wo pei fu ni de chu ti xiao lv

输出样例#1:

Unsuccessful @yyy loves Physics attempt
4
yyy loves Microelectronic

输入样例#2:

yyy loves OI : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Maths : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Chemistry : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves OI : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Maths : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Chemistry : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves OI : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Maths : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Chemistry : @yyy loves Physics wo pei fu ni de chu ti xiao lv
yyy loves Physics : ni men gou le 

输出样例#2:

Successful @yyy loves Physics attempt

说明

@yyy loves Physics 我佩服你的出题效率
此题仅吐槽soha,纪念出题者的队形,此队形长达91行。
对于100%的数据,每行消息长度<=1000
保证行数不超过50000
保证输入文件大小不超过4M
保证第一个说话的一定在艾特某人
保证大家的名字都是yyy loves ____ 的格式
保证每个人说的话中没有”:”
保证第一个说话的一定艾特了一个人且只@了一个人
保证第一个说话的一定不会艾特自己
保证文件结束一定有一行空行 方便你判定文件结束
并不保证后面说话的艾特了几个人 然而艾特人数不为一个人视为破坏队形
并不保证后面说话是否会反复艾特同一个人
并不保证被炸的人一定破坏队形
并不保证这一题是或不是压轴题
并不保证这一套比赛存在压轴题
并不保证下一套比赛和这一套比赛一样水
并不保证群里除了这4个人和kkksc以外没有别人了
并不保证你没AC这题的情况下吐槽soha不会出事儿
AC了可以吐槽soha一句,soha不会介意。

题解

写个题娱乐娱乐。
这个题就是个字符串模拟,通过:和@区分开说话人的名字和@的人的名字即可。
注意有一些细节:

  1. UNIX-like系统下换行符是\r\n,\r需要特判下(就这个破玩意我专门开个WSL试验了一下)
  2. 同一句话里@两次算作破坏队形
  3. 名称不一定全是字母,有可能包含特殊符号

代码

// Code by KSkun, 2018/5
#include <cctype>

#include <iostream>
#include <string>

const int MAXN = 500005;

inline std::string parsename(std::string text) {
    int pos = text.find(':');
    if(pos == std::string::npos) return "";
    return text.substr(0, pos - 1);
}

inline std::string parseat(std::string text) {
    int pos = text.find('@'), endp;
    if(pos == std::string::npos || text.find('@', pos + 1) != std::string::npos) return "";
    for(endp = pos + 11; endp < text.length(); endp++) {
        if(isblank(text[endp]) || text[endp] == '\r' || text[endp] == '\n') break;
    }
    return text.substr(pos + 1, endp - pos - 1);
}

std::string text, name, atname, qname;
int len;

int main() {
    while(!getline(std::cin, text).eof()) {
        name = parsename(text);
        if(name.empty()) break;
        len++;
        if(name == qname) {
            printf("Successful @%s attempt", qname.c_str());
            return 0;
        }
        atname = parseat(text);
        if(qname.empty()) qname = atname;
        if(atname.empty() || qname != atname) {
            printf("Unsuccessful @%s attempt\n", qname.c_str());
            printf("%d\n", len);
            printf("%s", name.c_str());
            return 0;
        }
    }
    printf("Unsuccessful @%s attempt\n", qname.c_str());
    printf("%d\n", len);
    printf("Good Queue Shape");
    return 0;
}


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据