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.