问题描述: | 蚊子最近经常做噩梦,然后就会被吓醒。这可不好。。疯子一直在发愁,然后突然有一天, 他发现蚊子其实就是害怕某些事。如果那些事出现在她的梦里,就会害怕。我们可以假定那 个害怕的事其实是一个字符串。而她做的梦其实也是一个字符串。 | |
数据输入: | 第1行两个整数N,M代表一共有N天梦和M个害怕的事。 | |
结果输出: | SUM | |
样例: | 2 2 abc def 1 2 abcdef defabc | 15 |
核心思想: | 模拟一秒的话能拿70,可以用kmp的,正好练练手 |
var
a,s:array[0..210]of string;
p,d:array[0..256]of longint;
i,j,sum,n,m:longint;
procedure kmp(l,x:longint);
var
i,j,k:longint;
begin
fillchar(p,sizeof(p),0);
j:=0;
fori:=2 to l do
begin
while (j>0)and(a[x][j+1]<>a[x][i]) do j:=p[j];
ifa[x][j+1]=a[x][i] then inc(j);
p[i]:=j;
end;
fork:=1 to n do
begin
j:=0;
for i:=1 to length(s[k]) do
begin
while (j>0)and(a[x][j+1]<>s[k][i]) do j:=p[j];
if a[x][j+1]=s[k][i] then inc(j);
if j=l then
begin
sum:=sum+(i-l+1)*d[x];
j:=p[j];
end;
end;
end;
end;
begin
assign(input,'p1252.in');reset(input);
assign(output,'p1252.out');rewrite(output);
readln(n,m);
sum:=0;
fori:=1 to m do readln(a[i]);
fori:=1 to m do readln(d[i]);
fori:=1 to n do readln(s[i]);
fori:=1 to m do
kmp(length(a[i]),i);
writeln(sum);
close(input);close(output);
end.
题目来源:NDK 1252