题意:给定两个字符串A、B,从前往后枚举A的每一个字符往另个串U里添加,若U的后缀的B则删除该后缀然后继续,保证最终答案不为空
先对串B跑一遍kmp,然后对A串按照题意模拟,用kmp加速这个过程(注意对串A的每一个位置存一下最后匹配到的位置,因为会删除一个后缀所以匹配的指针不能不管)
var
s1,s2,ss :ansistring;
i :longint;
p,l1,l2,l3 :longint;
next,pos :array[0..1000010] of longint;
begin
readln(s1); l1:=length(s1);
readln(s2); l2:=length(s2);
p:=0;
for i:=2 to l2 do
begin
while (p<>0) and (s2[i]<>s2[p+1]) do p:=next[p];
if s2[i]=s2[p+1] then
begin
inc(p);
next[i]:=p;
end else next[i]:=0;
end;
//
p:=0; l3:=0;
for i:=1 to l1 do
begin
ss:=ss+s1[i];
inc(l3); p:=pos[l3-1];
while (p<>0) and (ss[l3]<>s2[p+1]) do p:=next[p];
if ss[l3]=s2[p+1] then
begin
inc(p);
pos[l3]:=p;
end else pos[l3]:=0;
if p=l2 then
begin
dec(l3,l2);
delete(ss,l3+1,l2);
end;
end;
writeln(ss);
end.
——by Eirlys