/* ID: espr1t LANG: C++ TASK: Demo KEYWORDS: */ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX 16777216 using namespace std; FILE *in; FILE *out; char buff[MAX]; vector parseEmails() { fgets(buff, MAX, in); int len = (int)strlen(buff); while (len > 0 && (buff[len - 1] == '\n' || buff[len - 1] == '\r')) buff[--len] = 0; for (int i = 0; i < len; i++) if (buff[i] == ',') buff[i] = ' '; stringstream ss(buff); string str; vector ret; ss >> str; while (ss >> str) ret.push_back(str); return ret; } bool validEmail(string str) { if (str.size() == 0) return false; if (str[0] == '.' || str[0] == '@') return false; if (str[(int)str.size() - 1] == '.' || str[(int)str.size() - 1] == '@') return false; int cntAt = 0; for (int i = 0; i < (int)str.size(); i++) if (str[i] == '@') cntAt++; if (cntAt != 1) return false; int cntDots = 0; for (int i = (int)str.size() - 1; i >= 0; i--) { if (str[i] == '@') break; if (str[i] == '.') cntDots++; } if (cntDots <= 0) return false; for (int i = 0; i < (int)str.size() - 1; i++) if (str[i] == '.' || str[i] == '@') if (str[i + 1] == '.' || str[i + 1] == '@') return false; return true; } bool parseAttachment() { fgets(buff, MAX, in); int len = (int)strlen(buff); while (len > 0 && (buff[len - 1] == '\n' || buff[len - 1] == '\r')) buff[--len] = 0; if (len == 11) return true; bool isEmpty = true; while(1) { fgets(buff, MAX, in); int len = (int)strlen(buff); while (len > 0 && (buff[len - 1] == '\n' || buff[len - 1] == '\r')) buff[--len] = 0; if (len == 0) break; for (int i = 0; i < len; i++) if (buff[i] != ' ') isEmpty = false; } return isEmpty; } vector parseSubject() { vector ret; fgets(buff, MAX, in); int len = (int)strlen(buff); while (len > 0 && (buff[len - 1] == '\n' || buff[len - 1] == '\r')) buff[--len] = 0; stringstream ss(buff); string str; ss >> str; while (ss >> str) ret.push_back(str); return ret; } bool invalidBody; vector parseBody() { vector ret; int flag = 0; int lastWasEmpty = 0; while (1) { fgets(buff, MAX, in); int len = (int)strlen(buff); while (len > 0 && (buff[len - 1] == '\n' || buff[len - 1] == '\r')) buff[--len] = 0; if (len == 4) { int cflag = 1; for (int i = 0; i < 4; i++) if (buff[i] != '-') cflag = 0; if (cflag) break; } if (len == 0) { if (lastWasEmpty) invalidBody = true; lastWasEmpty = 1; } else lastWasEmpty = 0; stringstream ss(buff); string str; if (!flag) {flag = 1; ss >> str;} while (ss >> str) ret.push_back(str); } return ret; } int main(void) { in = stdin; out = stdout; in = fopen("email.in", "rt"); out = fopen("email.out", "wt"); vector e[4]; for (int i = 0; i < 4; i++) e[i] = parseEmails(); if (e[0].size() == 0) {fprintf(out, "1\n"); return 0;} if (e[1].size() + e[2].size() + e[3].size() == 0) {fprintf(out, "2\n"); return 0;} for (int i = 0; i < 4; i++) for (int c = 0; c < (int)e[i].size(); c++) if (!validEmail(e[i][c])) {fprintf(out, "3\n"); return 0;} bool hasEmptyAttachment = parseAttachment(); vector subject = parseSubject(); invalidBody = false; vector body = parseBody(); if (subject.size() == 0) {fprintf(out, "100\n"); return 0;} if (body.size() == 0) {fprintf(out, "101\n"); return 0;} if (invalidBody) {fprintf(out, "102\n"); return 0;} bool hasWordAttach = false; for (int i = 0; i < (int)body.size(); i++) { string srch = "attach"; for (int c = 0; c + (int)srch.size() <= (int)body[i].size(); c++) { bool found = true; for (int j = 0; j < (int)srch.size(); j++) if (srch[j] != body[i][c + j]) {found = false; break;} if (found) {hasWordAttach = true; break;} } if (hasWordAttach) break; } if (hasWordAttach && hasEmptyAttachment) {fprintf(out, "103\n"); return 0;} fprintf(out, "0\n"); return 0; }