P4824 [USACO15FEB]Censoring (Silver) 审查(银)

传送门

一个串的匹配肯定考虑KMP

那就暴力KMP

记录一下到每个字符时匹配的位置

找到一个符合的串就标记然后暴力回跳

感觉好像太暴力了...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e6+7;
char ch[N],a[N];
int f[N],match[N];
bool pd[N];
int main()
{
    scanf("%s",ch); scanf("%s",a);
    int len=strlen(ch),la=strlen(a),k=0;
    for(int i=1;i<la;i++)
    {
        while(k&&a[i]!=a[k]) k=f[k];
        f[i+1]= a[i]==a[k] ? ++k : 0;
    }
    //以下为暴力匹配
    int i=0; k=0;
    while(i<len)
    {
        while(k&&a[k]!=ch[i]) k=f[k];
        if(a[k]==ch[i]) k++;

        if(k==la)//找到匹配就暴力回跳
        {
            int j=1;
            while(j<=la)
            {
                if(pd[i])
                {
                    i--;
                    continue;
                }
                pd[i]=1,i--;
                j++;
            }
            while(pd[i]) i--;//最后还要跳一波
            k=match[i];
        }
        match[i]=k;
        i++;
        while(pd[i]) i++;
    }
    for(int i=0;i<len;i++)
    {
        if(pd[i]) continue;
        cout<<ch[i];
    }
    return 0;
}

膜一下CRK大佬,用的是AC自动机%%%

原文地址:https://www.cnblogs.com/LLTYYC/p/9684851.html

时间: 2024-10-09 05:43:47

P4824 [USACO15FEB]Censoring (Silver) 审查(银)的相关文章

「USACO15FEB」Censoring (Silver) 审查(银) 解题报告

题面 就是让你--在字符串A中,如果字符串B是A的子串,那么就删除在A中第一个出现的B,然后拼接在一起,一直重复上述步骤直到B不再是A的子串 |A|\(\le 10^6\) 思路: KMP+栈 1.由于是两个字符串匹配的问题,当然一下子就会想到KMP 2.由于是删去一段区间,很多人第一反应会想到链表,但是在这里,其实删除了一段后,对之前是没有影响的,并且,一定是从后往前删除,所以,更优的存储结构应该是栈. 3.有人会问,为什么删去对前面没有影响,这就根据KMP的原理,做到i这个位置的结果就是最优

[USACO15FEB] Censoring

Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material to read while waiting around in the barn during milking sessions. Unfortunately, the latest issue contains a rather inap

3940. [USACO15FEB]Censoring【AC自动机+栈】

Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material to read while waiting around in the barn during milking sessions. Unfortunately, the latest issue contains a rather inap

关于KMP的一点思考

关于KMP的一点思考 KMP的\(next\)数组的性质很精妙,有必要开一个坑学习一下 Part 1 啥是next \(next[i]\)表示对于\(pre_i\)这个字符串,这个抠出来的字符串本身后缀和前缀相等的最长长度.是一个自变量只和这个子串有关的函数.这点很重要 由于保证了是最长长度,这个数有一些优良的性质,常常在关于一个串的循环表示或者周期表示中发挥作用. 注意到这个\(next[i]\)虽然代表是这个最长长度,但是值得注意的是,由于字符串从1开始编号,所以这个值也是那个前缀的下标.

一个网工的十年奋斗史 - 移民篇

移民,一个一直以来工程师热于谈论 的热门话题.人们总喜欢在茶余饭后讨论某同事出国以后的生活,什么时候买了个别墅大house,什么时候晒了一下蓝天白云没有雾霾,让人羡慕不已.可是我们也同样忽略了移民背后的努力和艰辛.殊不知对于移民的人来说,也舍弃很多.试想一下,若不是觉得前途无望,谁又会背井离乡呢.下面就以我自己的移民经历为例,和大家聊聊移民背后的故事. 我目前定居于新西兰,一个羊比人多的国家.签证状态是PR(永久居住).顺便提一下,新西兰的永居签证是目前全世界唯一一个不用蹲移民监,并且拿到后可以

vim-airline的theme

在git:https://github.com/bling/vim-airline/tree/master/autoload/airline/themes 上看了下,一共有内置的这些主题,可以直接使用,方法是在.vimrc中写:let g:airline_theme="badwolf",或者在vim中打:AirlineTheme badwolf即可马上更改,但是不保存的. 下面都是可以选择的主题: badwolf 和dark差不多 base16 银,紫 behelit 浅蓝bubble

关于css3颜色

---恢复内容开始--- CSS的颜色可以通过以下方法指定: 十六进制颜色 RGB颜色 RGBA颜色 HSL色彩 HSLA颜色 预定义/跨浏览器的颜色名称 十六进制颜色 所有主要浏览器都支持十六进制颜色值. 指定一个十六进制的颜色其组成部分是:#RRGGBB,其中RR(红色),GG(绿色)和BB(蓝色).所有值必须介于0和FF之间. <p例如,#0000FF值呈现为蓝色,因为蓝色的组成设置为最高值(FF)而其他设置为0. RGB颜色 RGB颜色值在所有主要浏览器都支持. RGB颜色值指定:RGB

洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】

这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100005; int n,t[N],top; char a[N],b[N],s

LuoguP3121 [USACO15FEB]审查(黄金)Censoring (Gold)【Hash做法】By cellur925

题目传送门 其实这题正解是AC自动机的,字符串哈希吸氧才能过的,但是我太菜了不会...只能先用哈希苟了. 在扫描单词的时候首先把各个单词的哈希值和长度存起来.然后按照长度从小到大将各单词排序.而那个长长的字符串呢,我们就把它一点一点往栈里塞,够最小长度单词的长度时,我们就比较下,这样反复下去.如果遇到相同的字符串,就把他们弹出. 这个思路最巧妙的一点感觉就是用栈了.我自己写哈希的时候遇到删除的情况就布吉岛怎么搞了qwq. 这里的哈希值不能预处理出来的,而是动态维护的.因为有可能会删掉子串.所以只