結果
| 問題 |
No.996 Phnom Penh
|
| コンテスト | |
| ユーザー |
ganmodokix
|
| 提出日時 | 2019-11-01 13:52:21 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 21 ms / 2,000 ms |
| コード長 | 4,513 bytes |
| コンパイル時間 | 2,817 ms |
| コンパイル使用メモリ | 189,048 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-14 21:49:02 |
| 合計ジャッジ時間 | 4,156 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
// May this submission get accepted!
#pragma GCC optimize ("O3")
#pragma GCC target ("tune=native")
#pragma GCC target ("avx")
#include <bits/stdc++.h>
// 汎用マクロ
#define ALL_OF(x) (x).begin(), (x).end()
#define REP(i,n) for (long long i=0, i##_len=(n); i<i##_len; i++)
#define RANGE(i,is,ie) for (long long i=(is), i##_end=(ie); i<=i##_end; i++)
#define DSRNG(i,is,ie) for (long long i=(is), i##_end=(ie); i>=i##_end; i--)
#define STEP(i, is, ie, step) for (long long i=(is), i##_end=(ie), i##_step = (step); i<=i##_end; i+=i##_step)
#define UNIQUE(v) do { sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end()); } while (false)
template<class T> bool chmax(T &a, const T &b) {if (a < b) {a = b; return true;} return false; }
template<class T> bool chmin(T &a, const T &b) {if (a > b) {a = b; return true;} return false; }
#define INF 0x7FFFFFFF
#define LINF 0x7FFFFFFFFFFFFFFFLL
#define Yes(q) ((q) ? "Yes" : "No")
#define YES(q) ((q) ? "YES" : "NO")
#define Possible(q) ((q) ? "Possible" : "Impossible")
#define POSSIBLE(q) ((q) ? "POSSIBLE" : "IMPOSSIBLE")
#define DUMP(q) cerr << "[DEBUG] " #q ": " << (q) << " at " __FILE__ ":" << __LINE__ << endl
#define DUMPALL(q) do { cerr << "[DEBUG] " #q ": ["; REP(i, (q).size()) { cerr << (q)[i] << (i == i_len-1 ? "" : ", "); } cerr << "] at " __FILE__ ":" << __LINE__ << endl; } while (false)
template<class T> T gcd(T a, T b) { if (a < b) std::swap(a, b); while (b) std::swap(a %= b, b); return a; }
template<class T> T lcm(const T a, const T b) { return a / gcd(a, b) * b; }
// gcc拡張マクロ
#define popcount __builtin_popcount
#define popcountll __builtin_popcountll
// エイリアス
#define DANCE_ long
#define ROBOT_ unsigned
#define HUMAN_ signed
#define CHOKUDAI_ const
using ll = DANCE_ HUMAN_ DANCE_;
using ull = DANCE_ ROBOT_ DANCE_;
using cll = DANCE_ DANCE_ CHOKUDAI_;
using ld = long double;
using namespace std;
// モジュール
string op1(const string &s, ll &ans) {
ll n = s.size();
string t; t.reserve(n);
REP(i, s.size()) {
bool phnom = false;
if (i <= n-5) {
string s2(s.begin() + i, s.begin() + i + 5);
phnom = s2 == "phnom";
}
if (phnom) {
t += "penh";
i += 4;
++ans;
} else {
t.push_back(s[i]);
}
}
return t;
}
string op2(const string &s, ll &ans) {
string t; t.reserve(s.size());
bool sousa = false;
for (const char &c : s) {
if (c == 'e') {
t.push_back('h');
sousa = true;
} else if (c != 'h') {
t.push_back(c);
} else {
sousa = true;
}
}
if (sousa) ++ans;
return t;
}
// 処理内容
int main() {
// インタラクティブ問題では除去した方がいいかも
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s; cin >> s;
ll ans = 0;
REP(i, 2) {
string s1 = s;
ll cand = 0;
if (i) s1 = op2(s1, cand);
s1 = op1(s1, cand);
s1 = op2(s1, cand);
s1 = op1(s1, cand);
s1 = op2(s1, cand);
// DUMP(s1);
// DUMP(cand);
// FSM
vector<ll> phnom;
ll state = 0; // ?, p, h, n, o, m
ll width = 0; // # of "om"
REP(i, s1.size()) {
switch (state) {
case 0: if (s1[i] == 'p') state = 1; break;
case 1: if (s1[i] == 'h') state = 2; else state = s1[i] == 'p'; break;
case 2: if (s1[i] == 'n') state = 3; else state = s1[i] == 'p'; break;
case 3: if (s1[i] == 'o') state = 4; else state = s1[i] == 'p'; break;
case 4: if (s1[i] == 'm') state = 5; else state = s1[i] == 'p'; break;
case 5: if (s1[i] == 'o') state = 4; else state = s1[i] == 'p'; break;
}
if (state == 5) {
width++;
}
if (state <= 1 && width > 0) {
phnom.push_back(width);
width = 0;
}
}
if (width > 0) phnom.push_back(width);
if (phnom.size()) {
cand += accumulate(ALL_OF(phnom), 0LL) + *max_element(ALL_OF(phnom)) + 1;
} else {
s1 = op2(s1, cand);
}
chmax(ans, cand);
}
cout << ans << endl;
}
ganmodokix