洛谷p4824 Censoring S

k m p + 栈 kmp+栈 kmp+
题目链接

题目大意

给定字符串 a , b a,b a,b,在 a a a中不断删除 b b b,直到 a a a中没有完整的字符串 b b b,输出最终操作之后的 a a a

思路

k m p kmp kmp a a a中匹配 b b b,用栈进行删除操作
进行 k m p kmp kmp时,把下标 i i i入栈,匹配成功时执行出栈操作,更新 j j j到当时 i i i能匹配到最大位置开始再 k m p kmp kmp

ACcode

#include<bits/stdc++.h>

using namespace std;

const int M = 1e6 + 9;
int pmt[M], f[M], stk[M];

void get_pmt(const string& s, const string& p) {
    for (int i = 1, j = 0;i < p.size();i++) {
        while (j && p[i] != p[j])j = pmt[j - 1];
        if (p[i] == p[j])j++;
        pmt[i] = j;
    }
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    string s, p;cin >> s >> p;
    get_pmt(s, p);
    int top = 0;
    for (int i = 0, j = 0;i < s.size();i++) {
        while (j && s[i] != p[j])j = pmt[j - 1];
        if (s[i] == p[j])j++;
        f[i] = j;
        stk[++top] = i;
        if (j == p.size()) {
            top -= p.size();
            j = f[stk[top]];
        }
    }
    for (int i = 1;i <= top;i++)cout << s[stk[i]];
    return 0;
}
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值