首页 > 其他分享 >P4824 [USACO15FEB] Censoring S

P4824 [USACO15FEB] Censoring S

时间:2024-06-10 14:33:07浏览次数:24  
标签:nxt 字符 int Censoring USACO15FEB maxn kmp 监测 P4824

题目链接:https://www.luogu.com.cn/problem/P4824

kmp+栈

栈处理字符串问题有一道入门题:https://www.luogu.com.cn/problem/AT_abc328_d
实际上处理方式就是用数组模拟栈.在遍历字符串的过程中我们时刻监测,对未达到条件的字符我们进行压栈操作,然后如果说遇到了符合条件的字符就减去栈中的这一部分,然后对后面的字符继续重复上述操作.最后只需要输出一整个栈就行.

abc328d的参考代码:

#define maxn 200010
char stk[maxn];
int tp;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        stk[++tp]=s[i];
        if(stk[tp]=='C'&&stk[tp-1]=='B'&&stk[tp-2]=='A')
        {
            tp-=3;
        }
    }
    for(int i=1;i<=tp;i++)
    {
        cout<<stk[i];
    }
}

那么有了上一道题的经验,在这道题中我们也可以用相同的方式去监测和删除.
只不过这题需要删除的子串是一个长度范围为1-1e6的字符串,如果继续用上面这种暴力的监测方式时间复杂度最坏会达到 \(O(n^{2})\)
在这里我们考虑把监测方式从暴力改为kmp.运用kmp的匹配操作完成监测,可以把时间复杂度优化成线性的.
栈发挥的作用和上一道题基本一致,由于删除操作会导致单个字符左右相邻的字符的变动.所以我们需要使用一个pos数组,去记录在匹配时,文本串中每个位置在模式串中对应的位置.这样能在删除操作结束时更新模式串的指针位置.

#define maxn 1000010
string s,t;
int stk[maxn],top,pos[maxn];
vector<int> get_nxt(string s)
{
    int n=s.size();
    vector<int> nxt(n);
    for(int i=1,j=0;i<n;i++)
    {
        while(j&&s[i]!=s[j])
        {
            j=nxt[j-1];
        }
        j+=(s[i]==s[j]);
        nxt[i]=j;
    }
    return nxt;
}
void kmp(const string s,const string t)
{
    vector<int> nxt=get_nxt(t);
    for(int i=0,j=0;i<s.size();i++)
    {
        while(j&&s[i]!=t[j]) j=nxt[j-1];
        if(s[i]==t[j]) j++;
        pos[i]=j;
        stk[++top]=i;
        if(j==t.size())
        {
            top-=(int)(t.size());
            j=pos[stk[top]];
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>s>>t;
    kmp(s,t);
    for(int i=1;i<=top;i++)
    {
        cout<<s[stk[i]];
    }
}

标签:nxt,字符,int,Censoring,USACO15FEB,maxn,kmp,监测,P4824
From: https://www.cnblogs.com/captainfly/p/18240651

相关文章

  • Censoring S(板子)
    题目描述原题来自:USACO2015Feb.Silver给出两个字符串和,每次从前往后找到的一个子串并将其删除,空缺位依次向前补齐,重复上述操作多次,直到串中不含串。输出最终的串。输入格式第一行包含一个字符串,第二行包含一个字符串。样例输入whatthemomooofun......
  • Censoring S
    利用KMP和双端队列这一道题目中间会删除字符,考虑到这种动态的过程我们一般会用链表,栈或者队列维护这里为了方便最后的输出用双端队列考虑KMP的过程,他其实对字符串是不是在连续的一个存储空间里并没有要求,也就是说,如果我们给了一堆字符,即使不是按照字符数组那种放在连续的存储空......
  • P4824 [USACO15FEB] Censoring S
    P4824[USACO15FEB]CensoringSKMP+栈同样的套路,先找B的最长前后缀,然后与A匹配不同的是要删除A中的B,特殊的是删除之后可能会产生新的B那我们可以利用栈的思想,利用f数组,记录A每一位置上B的匹配程度,这样删除时,直接回到上一个匹配程度,以防漏掉。利用栈记录下标,还在栈内的,说明......
  • 做题记录:P3121 [USACO15FEB] Censoring G
    题目传送门:clickhere题意简化:给定一个文本串,和n个匹配串,删掉文本串中的匹配串求最后的字符串做这题之前应该先做简化版:eazymode上面这题用kmp+栈就能过以前如果用的是\(erase\)函数是错解,字符串的\(erase\)时间复杂度是常数级别的看到这道题后非常的高兴,直接打了个爆力跳......
  • P4826 [USACO15FEB] Superbull S题解
    SuperbullS题解题目传送门(可点击)题面题目描述\(Bessie\)和她的朋友们正在一年一度的\(Superbull\)锦标赛中打球,而\(Farmer\)\(John\)负责让比赛尽可能激动人心。总共有N支队伍(\(1\leN\le2000\))参加了\(Superbull\)锦标赛。每个团队都有一个\(1...2^{30}−1\)的团队ID......
  • BZOJ 3942: [Usaco2015 Feb]Censoring KMP
    3942:[Usaco2015Feb]CensoringTimeLimit: 10Sec  MemoryLimit: 128MBSubmit: 476  Solved: 260[Submit][Status][Discuss]DescriptionFarmerJohnhaspurchasedasubscriptiontoGoodHooveskeepingmagazineforhiscows,sotheyhaveplentyofmateria......
  • Luogu P4824 [USACO15FEB] Censoring S
    [USACO15FEB]CensoringS题面翻译FarmerJohn为他的奶牛们订阅了GoodHooveskeeping杂志,因此他们在谷仓等待挤奶期间,可以有足够的文章可供阅读。不幸的是,最新一期的文章包含一篇关于如何烹制完美牛排的不恰当的文章,FJ不愿让他的奶牛们看到这些内容。FJ已经根据杂志的所有文字,......
  • 洛谷P4824题解
    题面题意:给出字符串s和t,每次操作将s中出现的第一个t删去,直到不能删为止。求最后的串。|s|<=1e6题解:hash做法。(此题也有kmp和权值线段树做法)因为涉及到删除操作,所以我们要动态的实现这个过程。所以考虑开一个栈来存储当前留下的字符。然后每有一个字符入栈,就拿当前......
  • P4824 [USACO15FEB] Censoring S
    希望在Str中删掉1个屏蔽词(一个屏蔽词可能出现多次)求最后的串 栈+hash #include<iostream>#include<cstring>usingnamespacestd;constintN=1e6+3;......
  • 关于AC自动机的一些理解 || Luogu3121 & 4824 Censoring - 哈希 - AC自动机
    题目链接:https://www.luogu.com.cn/problem/P3121(4824)题解:4824是CensoringS,只需要对单模式串进行操作,3121需要对多模式串4824开一个前缀hash数组,每次扫到当前点......