传送门
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.