遥控车 (Standard IO)

题意/Description:

        平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i]。韵韵早就迫不及待地想玩名字是s的遥控车。可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀(也就是说能确定一个i,使s是name[i]的前缀),这时她就能玩第i辆车;或者是一个无中生有的名字,即s不是任何一辆车名字的前缀,这时候她什么也不能玩。
        你需要完成下面的任务:
            1.韵韵想了m个她想要的名字,请告诉她能玩多少次。
            2.由于管理员粗心的操作,导致每辆车的摆放位置都可能出现微小的差错,原来第i辆车现在的位置可能是i-1、i、i+1中的任意一个(第1辆车的位置不可能是0,第n辆车的位置不可能是n+1)。请你计算出共有多少种可能的排列。
        注:数据保证当s是name[i]的前缀时,i是唯一确定的。一辆车可以玩多次。

 

读入/Input

        第一行是2个正整数n、m。
        接下来n行,每行1个字符串name[i],表示第i辆车的名字。
        接下来m行,每行1个字符串s,表示韵韵想要的名字。

 

输出/Output

        第一行输出韵韵能玩的次数。
        第二行输出共有多少种可能的排列。

 

题解/solution

        将每一个字符串name[i]的每一个前缀枚举出来,转换为数字;后面的字符串s也进行以上操作。只要比较字符串s和name[i]的每一个前缀,即可得出第一问。第二问就是一个斐波那契,不过要用高精度做。

 

代码/Code

 

var
  n,m,sum,k:longint;
  la:array [0..20001] of longint;
  a:array [0..20001] of real;
  str:array [0..20001,0..300] of real;
  aa,bb,cc:array [0..50001] of integer;
procedure init;
var
  i,j,l:longint;
  s:string;
begin
  fillchar(a,sizeof(a),0);
  fillchar(str,sizeof(str),0);
  readln(n,m);
  for i:=1 to n do
    begin
      readln(s);
      l:=length(s);
      for j:=1 to l do
        str[i,j]:=str[i,j-1]*1.9+ord(s[j]);
    end;
  for i:=1 to m do
    begin
      readln(s);
      l:=length(s);
      la[i]:=l;
      for j:=1 to l do
        a[i]:=a[i]*1.9+ord(s[j]);
    end;
  sum:=0;
end;

procedure main;
var
  i,j,l:longint;
begin
  for i:=1 to n do
    for j:=1 to m do
      if str[i,la[j]]=a[j] then inc(sum);
  writeln(sum);
  cc[1]:=1; aa[1]:=1;
  for j:=1 to n do
    begin
      bb:=cc; cc:=aa;
  for i:=1 to k do
    begin
      aa[i]:=aa[i]+bb[i];
      aa[i+1]:=aa[i+1]+aa[i] div 10;
      aa[i]:=aa[i] mod 10;
    end;
  if aa[k+1]<>0 then inc(k);
  end;
  for i:=k downto 1 do
    write(aa[i]);
end;

begin
  init;
  main;
end.



posted @ 2016-07-08 13:54  猪都哭了  阅读(168)  评论(0编辑  收藏  举报