問題描述: |
蚊子最近經常做噩夢,然後就會被嚇醒。這可不好。。瘋子一直在發愁,然後突然有一天, 他發現蚊子其實就是害怕某些事。如果那些事出現在她的夢裏,就會害怕。我們可以假定那 個害怕的事其實是一個字符串。而她做的夢其實也是一個字符串。 |
|
數據輸入: |
第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