【NOIP2018复习】So many prefix?(KMP应用)

1217.So many prefix?

时间限制:1000MS内存限制:256000KB

题目描述



输入

共一行,一个字符串S

输出

共一行,输出一个整数,代表长度为偶数的前缀在整个字符串出现的前缀和

输入样例复制

样例一:
abababc

样例二:
isdashagayisdashagaydashisnotagaydashisnotagay

输出样例复制

样例一:
6

样例二:
30

题解:KMP的next数组表示最大前缀后缀相同长度

          f[i]表示以1-i中偶数前缀后缀的前缀和
         因为同样的前缀会被统计多次,所以前缀和 

const

  maxn=200000;

var

  st:ansistring;

  next,f:array[0..maxn]of longint;

  n,m,i,j,k,ans:longint;

procedure init;

var

  i:longint;

begin

  readln(st);

  n:=length(st);

end;

procedure getnext;

var

  i:longint;

begin

  next[0]:=-1;next[1]:=0;k:=0;

  for i:=2 to n do

  begin

    while (k>0)and(st[k+1]<>st[i]) do k:=next[k];

    if st[k+1]=st[i] then

    begin

      inc(k);

      next[i]:=k;

    end;

  end;

end;

begin

  init;

  getnext;

  for i:=2 to n do

  begin

    if i mod 2=0 then f[i]:=1;

    f[i]:=f[i]+f[next[i]];

    ans:=ans+f[i];

  end;

  writeln(ans);

end.

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值