1 条题解

  • 0
    @ 2025-10-14 16:55:04

    满分题解:

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        string s, t; // 输入字符串
        cin >> s >> t;
        int n = s.size(), m = t.size();
        // 如果T为空或S为空,直接输出
        if (m == 0) {
            cout << s << endl;
            return 0;
        }
        // 预处理T的next数组(KMP算法)
        vector<int> nxt(m, 0);
        for (int i = 1, j = 0; i < m; i++) {
            while (j > 0 && t[i] != t[j]) j = nxt[j - 1];
            if (t[i] == t[j]) j++;
            nxt[i] = j;
        }
        // 使用栈结构存储字符和匹配长度
        vector<char> st; // 字符栈
        vector<int> mt;  // 匹配长度栈    
        // 遍历S中的每个字符
        for (char c : s) {
            // 将当前字符压入栈
            st.push_back(c);       
            // 计算当前匹配长度
            int cur = 0;
            if (!mt.empty()) {
                cur = mt.back(); // 获取上一个匹配长度
            }
            
            // KMP匹配过程
            while (cur > 0 && c != t[cur]) {
                cur = nxt[cur - 1];
            }
            if (c == t[cur]) {
                cur++;
            }
            
            // 将当前匹配长度压入栈
            mt.push_back(cur);
            
            // 如果匹配长度等于T的长度,删除匹配成功的子串
            if (cur == m) {
                // 弹出匹配成功的子串
                for (int i = 0; i < m; i++) {
                    st.pop_back();
                    mt.pop_back();
                }
            }
        }
        // 输出最终结果
        for (char c : st) {
            cout << c;
        }
        cout << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    926
    时间
    1000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    11
    已通过
    3
    上传者