社区讨论
所以只用 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 条回复,欢迎继续交流。
正在加载回复...