NDK 1252 不怕噩夢

問題描述:

 蚊子最近經常做噩夢,然後就會被嚇醒。這可不好。。瘋子一直在發愁,然後突然有一天,  他發現蚊子其實就是害怕某些事。如果那些事出現在她的夢裏,就會害怕。我們可以假定那  個害怕的事其實是一個字符串。而她做的夢其實也是一個字符串。 
 她可以一個晚上一直做夢,所以夢這個字符串會很長,如果其中包含了她所害怕的事情,那  麼她這天晚上就會害怕。當然一個害怕的事也可能在這天晚上被她夢到很多遍,當然每個晚  上也可能有很多種害怕的事都被夢到。 
 每個害怕的事都有一定的權值。而這天晚上如果夢到了某件事,那麼這件事所產生的黑暗效  果等於這件事的權值乘以這個害怕的事在夢字符串裏的開始位置。如果同樣的事夢到了很多  遍,那麼就重複上面的操作很多遍。當天晚上的黑暗效果總和等於當天所有害怕的事產生的  黑暗效果累加到一起。現在瘋子想知道蚊子這些天來噩夢的黑暗效果總和是多少。 

數據輸入:

 第1行兩個整數N,M代表一共有N天夢和M個害怕的事。 
 第2行到第M+1行。每行一個字符串ti,代表第I個害怕的事 
 第M+2行到第2M+2行。每行一個整數ai.代表第I個害怕的事權值 
 第2M+3行到第N+2M+3行。每行一個字符串si,代表第I天的夢。

結果輸出:

 SUM 
 SUM=N天裏黑暗效果的總和。 
 我們保證每天的黑暗效果都小於maxlongint; 

樣例:

 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章