[NKOI1315] 子串清除

传送门

http://oi.nks.edu.cn/searchproblem

题目大意

给定A,B串,在A串中从左向右找到B然后删除,询问重复多少次后停止

题解

找到B的位置可以KMP,但有删除,所以每次我们把A串按位依次加入栈中,j=m时把栈尾变成i-m,每次记录A串匹配到i时,B串匹配的指针j在哪里,为删除后j指针返回做准备

var
 next:array[0..400]of longint;
 t,a,b,f:array[0..1000000]of longint;
 i,j,k:longint;
 n,m,ans,len:longint;
 cha:char;
begin
 m:=0;
 while not eoln do
  begin read(cha); inc(m); b[m]:=ord(cha)-96; end; readln;
 n:=0;
 while not eoln do
  begin read(cha); inc(n); a[n]:=ord(cha)-96; end;
 j:=0; next[1]:=0;
 for i:=2 to m do
  begin
   while (j>0)and(b[j+1]<>b[i]) do j:=next[j];
   if b[j+1]=b[i] then inc(j);
   next[i]:=j;
  end;
 j:=0; i:=1; len:=1; t[1]:=a[1];
 while len<=n do
  begin
   while (j>0)and(b[j+1]<>t[i]) do j:=next[j];
   if b[j+1]=t[i] then inc(j);
   f[i]:=j;
   if j=m then begin inc(ans); dec(i,m); j:=f[i]; end;
   inc(i); inc(len); t[i]:=a[len];
  end;
 writeln(ans);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值