bzoj 3924 模拟+kmp

题意:给定两个字符串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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值