遥控车 (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.