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

Luogu P4824 [USACO15FEB] Censoring S

时间:2023-06-11 17:46:47浏览次数:62  
标签:include int Luogu USACO15FEB l2 nex 字符串 P4824 5211314

[USACO15FEB] Censoring S

题面翻译

Farmer John为他的奶牛们订阅了Good Hooveskeeping杂志,因此他们在谷仓等待挤奶期间,可以有足够的文章可供阅读。不幸的是,最新一期的文章包含一篇关于如何烹制完美牛排的不恰当的文章,FJ不愿让他的奶牛们看到这些内容。

FJ已经根据杂志的所有文字,创建了一个字符串 $ S $ ( $ S $ 的长度保证不超过 $ 10^6 $ ),他想删除其中的子串 $ T $ ,他将删去 $ S $ 中第一次出现的子串 $ T $ ,然后不断重复这一过程,直到 $ S $ 中不存在子串 $ T $ 。

注意:每次删除一个子串后,可能会出现一个新的子串 $ T $ (说白了就是删除之后,两端的字符串有可能会拼接出来一个新的子串 $ T $ )。

输入格式:第一行是字符串 $ S $ ,第二行输入字符串 $ T $ ,保证 $ S $ 的长度大于等于 $ T $ 的长度, $ S $ 和 $ T $ 都只由小写字母组成。

输出格式:输出经过处理后的字符串,保证处理后的字符串不会为空串。

Translated by @StudyingFather

题目描述

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 inappropriate article on how to cook the perfect steak, which FJ would rather his cows not see (clearly, the magazine is in need of better editorial oversight).

FJ has taken all of the text from the magazine to create the string \(S\) of length at most 10^6 characters. From this, he would like to remove occurrences of a substring \(T\) to censor the inappropriate content. To do this, Farmer John finds the first occurrence of \(T\) in \(S\) and deletes it. He then repeats the process again, deleting the first occurrence of \(T\) again, continuing until there are no more occurrences of \(T\) in \(S\). Note that the deletion of one occurrence might create a new occurrence of \(T\) that didn't exist before.

Please help FJ determine the final contents of \(S\) after censoring is complete.

输入格式

The first line will contain \(S\). The second line will contain \(T\). The length of \(T\) will be at most that of \(S\), and all characters of \(S\) and \(T\) will be lower-case alphabet characters (in the range a..z).

输出格式

The string \(S\) after all deletions are complete. It is guaranteed that \(S\) will not become empty during the deletion process.

样例 #1

样例输入 #1

whatthemomooofun
moo

样例输出 #1

whatthefun
//注意题目里要求像消消乐一样
//如果接触的字符串匹配(消掉之后的两边接触的字符串也算)就直接消掉
//而不是先消一轮之后 再消之前消掉的两边的字符串 
//以下是错误代码
/*
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<queue>

using namespace std;

char a[5211314 >> 2], b[5211314 >> 2], tem[5211314 >> 2];
int nex[5211314 >> 2], l1, l2;
int l[5211314 >> 2], r[5211314 >> 2], count_;

int main() {
	scanf("%s", a + 1);
	scanf("%s", b + 1);
	l1 = strlen(a + 1);
	l2 = strlen(b + 1);
	nex[0] = 1;
	for (int i = 2, j = 0; i <= l2; ++ i) {
		while (j > 0 && b[j + 1] != b[i]) {
			j = nex[j];
		}
		if (b[j + 1] == b[i]) j ++;
		nex[i] = j;
	}
	do {
		count_ = 0;
		for (int i = 1, j = 0; i <= l1; ++ i) {
			while (j > 0 && b[j + 1] != a[i]) {
				j = nex[j];
			}
			if (b[j + 1] == a[i]) j ++;
			if (j == l2) {
				count_ ++;
				l[count_] = i - l2 + 1;
				r[count_] = i;
				j = 0;
			}
		}
		int len = 0;
		for (int i = 1, temp = 1; i <= l1; ++ i) {
			if (i == l[temp]) {
				i = r[temp];
				temp ++;
			}
			else {
				len ++;
				tem[len] = a[i];
			}
		}
		memset(l, 0, sizeof(l));
		memset(r, 0, sizeof(r));
		l1 = len;
		for (int i = 1; i <= l1; ++ i) {
			a[i] = tem[i];
		}
	} while(count_ != 0);
	for (int i = 1; i <= l1; ++ i) {
		cout << a[i];
	}
	cout << endl;
	return 0;
}
*/ 
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>

using namespace std;

char a[5211314 >> 2], b[5211314 >> 2];
int nex[5211314 >> 2], l1, l2;
int sta[5211314 >> 2], top, record[5211314 >> 2];

int main() {
	scanf("%s", a + 1);
	scanf("%s", b + 1);
	l1 = strlen(a + 1);
	l2 = strlen(b + 1);
	nex[0] = 1;
	for (int i = 2, j = 0; i <= l2; ++ i) {
		while (j > 0 && b[j + 1] != b[i]) {
			j = nex[j];
		}
		if (b[j + 1] == b[i]) j ++;
		nex[i] = j;
	}
	for (int i = 1, j = 0; i <= l1; ++ i) {
		while (j > 0 && b[j + 1] != a[i]) {
			j = nex[j];
		}
		if (b[j + 1] == a[i]) j ++;
		record[i] = j;
		//记录第i个字符对应的j 
		sta[++ top] = i;
		//将i压入栈内 
		if (j == l2) {
			//若可以匹配 
			top -= l2;
			//将栈的大小减去匹配字符串的长度 
			j = record[sta[top]];
			//将先前记录的字符对应的j值赋上 
		}
	}
	for (int i = 1; i <= top; ++ i) {
		cout << a[sta[i]];
		//输出 
	}
	return 0;
}

标签:include,int,Luogu,USACO15FEB,l2,nex,字符串,P4824,5211314
From: https://www.cnblogs.com/jueqingfeng/p/17473262.html

相关文章

  • Luogu P3375 【模板】KMP字符串匹配
    【模板】KMP字符串匹配题目描述给出两个字符串\(s_1\)和\(s_2\),若\(s_1\)的区间\([l,r]\)子串与\(s_2\)完全相同,则称\(s_2\)在\(s_1\)中出现了,其出现位置为\(l\)。现在请你求出\(s_2\)在\(s_1\)中所有出现的位置。定义一个字符串\(s\)的border为\(s\)......
  • Luogu P3167 [CQOI2014]通配符匹配
    [CQOI2014]通配符匹配题目描述几乎所有操作系统的命令行界面(CLI)中都支持文件名的通配符匹配以方便用户。最常见的通配符有两个,一个是星号(”“'),可以匹配0个及以上的任意字符:另一个是问号(”?“),可以匹配恰好一个任意字符。现在需要你编写一个程序,对于给定的文件名列表和一个包......
  • Luogu P4591 [TJOI2018]碱基序列
    [TJOI2018]碱基序列题目描述小豆参加了生物实验室。在实验室里,他主要研究蛋白质。他现在研究的蛋白质是由\(k\)个氨基酸按一定顺序构成的。每一个氨基酸都可能有\(a\)种碱基序列\(s_{i,j}\)构成。现在小豆有一个碱基串\(s\),小豆想知道在这个碱基上都多少中不同的组合方式可能得......
  • Luogu P4159 [SCOI2009] 迷路
    [SCOI2009]迷路题目背景windy在有向图中迷路了。题目描述该有向图有\(n\)个节点,节点从\(1\)至\(n\)编号,windy从节点\(1\)出发,他必须恰好在\(t\)时刻到达节点\(n\)。现在给出该有向图,你能告诉windy总共有多少种不同的路径吗?答案对\(2009\)取模。注意:windy......
  • Luogu P1939 【模板】矩阵加速(数列)
    【模板】矩阵加速(数列)题目描述已知一个数列\(a\),它满足:\[a_x=\begin{cases}1&x\in\{1,2,3\}\\a_{x-1}+a_{x-3}&x\geq4\end{cases}\]求\(a\)数列的第\(n\)项对\(10^9+7\)取余的值。输入格式第一行一个整数\(T\),表示询问个数。以下\(T\)行,每行一个正......
  • Luogu P3390 【模板】矩阵快速幂
    【模板】矩阵快速幂题目背景一个\(m\timesn\)的矩阵是一个由\(m\)行\(n\)列元素排列成的矩形阵列。即形如\[A=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&......
  • Luogu B2105 矩阵乘法(模板)
    矩阵乘法题目描述计算两个矩阵的乘法。\(n\timesm\)阶的矩阵\(A\)乘以\(m\timesk\)阶的矩阵\(B\)得到的矩阵\(C\)是\(n\timesk\)阶的,且\(C[i][j]=A[i][0]\timesB[0][j]+A[i][1]\timesB[1][j]+\)……\(+A[i][m-1]\timesB[m-1][j](C[i][j]\)表示\(C\)......
  • Luogu P4219 [BJOI2014]大融合
    [BJOI2014]大融合题目描述小强要在\(N\)个孤立的星球上建立起一套通信系统。这套通信系统就是连接\(N\)个点的一个树。这个树的边是一条一条添加上去的。在某个时刻,一条边的负载就是它所在的当前能够联通的树上路过它的简单路径的数量。例如,在上图中,现在一共有了\(5\)......
  • Luogu P4577 [FJOI2018] 领导集团问题
    [FJOI2018]领导集团问题题目描述一个公司的组织领导架构可以用一棵领导树来表示。公司的每个成员对应于树中一个结点\(v_i\),且每个成员都有响应的级别\(w_i\)。越高层的领导,其级别值\(w_i\)越小。树中任何两个结点之间有边相连,则表示与结点相应的两个成员属于同一部门。领......
  • Luogu P5446 [THUPC2018] 绿绿和串串
    根据题目能发现一个性质,设转化前的字符串为\(s\),转化后的字符串为\(s'\),则\(s'_{|s|}\)为\(s'\)的中心,即\(s'_{|s|}\)求出来的回文串左边界为\(1\)右边界为\(|s'|\)找出这个性质就挺简单了,考虑先对给出的\(S\)用\(\text{manacher}\)求出每个节点\(i\)对应的左边......