社区讨论

所以只用 KMP 就不行吗(58pts)

P4824[USACO15FEB] Censoring S参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhji6rjp
此快照首次捕获于
2025/11/04 02:58
4 个月前
此快照最后确认于
2025/11/04 02:58
4 个月前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <cstring> 
using namespace std;
#define next next0
const int N=1e6+10;
char a[N],b[N];
int next[N];
int n,m;
bool solve()
{
	int j=0;
	bool ret=0;//有没有找到模式串 
	int minus=0;//删掉时减去的长度 
	for(int i=1;i<=n;)
	{
		while(i<=n&&a[i]=='~')
		{
			i++;continue;
		}
		if(i>n) return ret;
		int add=0;//表示统计的中间经过了多少删除的字符 
		while(i<=n&&j<m&&a[i]==b[j+1])
		{
			i++;j++;
			while(i<=n&&a[i]=='~')
			{
				i++;add++;
				if(i>n) return ret;
				continue;
			}
			
		}
		if(j==m)
		{
			for(int _=i-m-add;_<i;_++)
			{
				a[_]='~';//执行删除操作 
			}
			ret=1;
		}
		j=next[j];
		if(j==-1)
		{
			i++;j++;
			while(i<=n&&a[i]=='~')
			{
				i++; 
				if(i>n) return ret;
				continue;
			}
		}
	}
	return ret;
}
int main()
{
	scanf("%s%s",a+1,b+1);
	n=strlen(a+1),m=strlen(b+1);
	int j=-1;
	next[0]=-1;
	for(int i=1;i<=m;i++)
	{
		while(j>=0&&b[i]!=b[j+1]) j=next[j];
		next[i]=++j;
	}
	while(solve());
	for(int i=1;i<=n;i++)
	{
		if(a[i]!='~')
		{
			cout
			//<<i<<":"
			<<a[i]
			//<<' '
			;
		}
	}
	cout<<'\n';
	
	return 0; 
}

回复

2 条回复,欢迎继续交流。

正在加载回复...