BZOJ 3942 Usaco2015 Feb Censoring KMP算法

题目大意:给定两个串A和B,要求将A中删掉所有的B后输出

为何BC群刚有人问完我这题的【C++语法基础题】版之后就出了个KMP版的= =

维护一个栈,将A中的字符依次加进去,一旦A的栈顶出现了B就弹栈

用KMP算法来加速这个过程即可

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 1001001
using namespace std;
int len;
char s1[M],s2[M];
int next[M];
char stack[M];
int a[M],top;
void KMP(char s[])
{
	int i,fix=0;
	for(i=2;s[i];i++)
	{
		while( fix && s[i]!=s[fix+1] )
			fix=next[fix];
		if(s[i]==s[fix+1])
			++fix;
		next[i]=fix;
	}
}
int main()
{
	int i;
	scanf("%s%s",s1+1,s2+1);
	len=strlen(s2+1);KMP(s2);
	for(i=1;s1[i];i++)
	{
		stack[++top]=s1[i];
		int fix=a[top-1];
		while(fix&&s2[fix+1]!=stack[top])
			fix=next[fix];
		if(s2[fix+1]==stack[top])
			++fix;
		a[top]=fix;
		if(a[top]==len)
			top-=len;
	}
	stack[top+1]=0;
	puts(stack+1);
	return 0;
}
时间: 2024-10-09 04:34:54

BZOJ 3942 Usaco2015 Feb Censoring KMP算法的相关文章

BZOJ 3942: [Usaco2015 Feb]Censoring

3942: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 404  Solved: 221[Submit][Status][Discuss] Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material

bzoj 3940: [Usaco2015 Feb]Censoring -- AC自动机

3940: [Usaco2015 Feb]Censoring Time Limit: 10 Sec  Memory Limit: 128 MB 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

bzoj3942: [Usaco2015 Feb]Censoring

AC自动机.嗯bzoj3940弱化版.水过去了(跑的慢啊QAQ.想了想可以用hash写.挖坑 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define clr(x,c) memset

BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

题目大意:给定长度为m的数字串s,求不包含子串s的长度为n的数字串的数量 n<=10^9 光看这个O(n)就是挂 我们不考虑这个 令f[i][j]为长度为i的数字串中最后j位与s中的前j位匹配的方案数 比如当s为12312时 f[i][3]表示长度为i,以123结尾且不包含子串"12312"的方案数 a[x][y]为f[i-1][x]转移至f[i][y]的方案数 换句话说(可能描述不清楚) a[x][y]为s的长度为x的前缀加上一个数字后 后缀可以与最长长度为y的前缀匹配 这个数

[Usaco2015 Feb]Censoring

A. Censoring 题目描述 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 rathe

Bzoj3940 [Usaco2015 Feb]Censoring

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 391  Solved: 183 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

BZOJ 3943 Usaco2015 Feb SuperBull Prim

题目大意:给定n个数,每次选择两个数,将两数的异或值计入答案,并删掉其中一个,反复如此直到只剩一个数为止,求答案的最大值 每次将选择的两个数连边,那么显然会得到一棵树 用Prim算法求最大生成树即可 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 2020 using namespace std; int n,a[M]; long

BZOJ 1355 Baltic2009 Radio Transmission KMP算法

题目大意:给定一个字符串,求最小循环节(可以不整除) 样例的Hint是错的无视掉就好 循环节应该是cab 这题利用了KMP中next数组的性质,也就是n-next[n]表示循环节 POJ的题都要求整除,这题不用整除,直接输出n-next[n]即可 注意next数组不要开成char~ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 10010

【bzoj3940】[Usaco2015 Feb]Censoring

[题目描述] FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词 记为t_1...t_N.他希望从S中删除这些单词. FJ每次在S中找到最早出现的列表中的单词(最早出现指该单词的开始位置最小),然后从S中删除这个单词.他重复这个操作直到S中 没有列表里的单词为止.注意删除一个单词后可能会导致S中出现另一个列表中的单词 FJ注意到列表中的单词不会出现一个单词是另一个单词子串的情况,这意味着每个列表中的单词在S中出现的开始位置是