結果
| 問題 | 
                            No.996 Phnom Penh
                             | 
                    
| コンテスト | |
| ユーザー | 
                             qwewe
                         | 
                    
| 提出日時 | 2025-05-14 12:58:29 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 6,119 bytes | 
| コンパイル時間 | 574 ms | 
| コンパイル使用メモリ | 74,324 KB | 
| 実行使用メモリ | 16,072 KB | 
| 最終ジャッジ日時 | 2025-05-14 12:59:37 | 
| 合計ジャッジ時間 | 11,637 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 21 TLE * 1 -- * 3 | 
ソースコード
#include <iostream>
#include <string>
#include <vector> // Used for std::vector but not essential here, string manipulation is enough
#include <numeric> // Not used, can remove include
/**
 * @brief Applies Operation 2 to the given string `s`.
 * 
 * Operation 2 consists of two steps:
 * 1. Remove all occurrences of the character 'h' from the string.
 * 2. Replace all occurrences of the character 'e' with 'h' in the resulting string.
 * 
 * The operation is considered valid only if the string changes as a result.
 * The function modifies the string `s` in place.
 * 
 * @param s The string to apply Operation 2 on. Passed by reference and modified.
 * @return true If the string `s` was changed by the operation.
 * @return false If the string `s` remained unchanged after the operation.
 */
bool apply_op2(std::string& s) {
    // Keep a copy of the original string to compare later and determine if the string changed.
    std::string original_s = s; 
    // Step 1: Create an intermediate string `next_s` by removing all 'h' characters from `s`.
    std::string next_s = "";
    // Optimization: Reserve memory for `next_s` roughly equivalent to the current string length.
    // This can reduce the number of memory reallocations needed as `next_s` grows.
    next_s.reserve(s.length()); 
    for (char c : s) { // Iterate through each character of the input string `s`
        if (c != 'h') { // If the character is not 'h'
            next_s += c; // Append it to the intermediate string `next_s`
        }
    }
    
    // Clear the original string `s` to prepare for rebuilding it based on `next_s`.
    s.clear(); 
    // Optimization: Reserve memory for the final string `s`. Its length will be exactly the length of `next_s`.
    s.reserve(next_s.length()); 
    // Step 2: Rebuild `s` from `next_s`. Replace 'e' characters with 'h'.
    for (char c : next_s) { // Iterate through each character of the intermediate string `next_s`
        if (c == 'e') { // If the character is 'e'
            s += 'h'; // Append 'h' to the final string `s`
        } else { // For any other character
            s += c; // Append the character itself to `s`
        }
    }
    // Return true if the final string `s` is different from the `original_s`.
    // This indicates that Operation 2 successfully changed the string.
    return s != original_s;
}
int main() {
    // Optimize standard C++ I/O operations for speed.
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    
    std::string s; // Declare a string variable to store the input.
    std::cin >> s; // Read the input string from standard input.
    
    long long op_count = 0; // Initialize a counter for the total number of operations performed. Using long long for potentially large counts.
    
    std::string target = "phnom"; // The substring to search for in Operation 1.
    std::string replacement = "penh"; // The string to replace "phnom" with in Operation 1.
    // Main loop: continues as long as operations can be performed that change the string.
    // This implements a greedy strategy: prioritize Op1, then try Op2 if Op1 is not possible.
    while (true) { 
        // --- Try Operation 1 ---
        // Find the starting position (`pos`) of the first occurrence of the target substring "phnom".
        // `std::string::npos` is returned if the substring is not found.
        size_t pos = s.find(target); 
        
        // Check if "phnom" was found in the string `s`.
        if (pos != std::string::npos) {
             // If "phnom" is found, perform Operation 1: replace it with "penh".
             // `s.replace(pos, target.length(), replacement)` replaces the substring of length `target.length()` starting at `pos` with `replacement`.
             s.replace(pos, target.length(), replacement); 
             op_count++; // Increment the operation counter.
             // After successfully applying Op1, restart the `while` loop immediately using `continue`.
             // This ensures that we always check for Op1 possibilities first after any change.
             continue; 
        }
        // --- If Op1 was not possible, Try Operation 2 ---
        
        // Before attempting Op2, check if the string contains 'h' or 'e'. 
        // Op2 requires at least one 'h' to remove or one 'e' to replace with 'h' to potentially change the string.
        // If neither 'h' nor 'e' exists, Op2 cannot change the string.
        bool has_h_or_e = false; // Flag to track if 'h' or 'e' is present.
        for(char c : s) { // Iterate through the characters of the string `s`.
            if (c == 'h' || c == 'e') { // If 'h' or 'e' is found
                has_h_or_e = true; // Set the flag to true.
                break; // Exit the loop early as we've confirmed presence.
            }
        }
        // Proceed with Op2 only if 'h' or 'e' was found in the string.
        if (has_h_or_e) {
             // Attempt to apply Op2. The function `apply_op2` modifies `s` in place.
             // It returns `true` if the string was changed, `false` otherwise.
             if (apply_op2(s)) { 
                 op_count++; // If Op2 successfully changed the string, increment the operation counter.
                 // After successfully applying Op2, restart the `while` loop using `continue`.
                 // This allows checking if Op2 created new opportunities for Op1.
                 continue; 
             }
        }
        
        // --- Termination Condition ---
        // If the code reaches this point, it implies that:
        // 1. Operation 1 ("phnom" -> "penh") could not be applied (no "phnom" found).
        // 2. AND Operation 2 either was not applicable (no 'h' or 'e') or was applied but did not change the string.
        // In this state, no further operations can modify the string according to the rules.
        // Therefore, break out of the `while` loop.
        break; 
    }
    
    // Print the final total count of operations performed.
    std::cout << op_count << std::endl;
    
    return 0; // Indicate successful program execution.
}
            
            
            
        
            
qwewe