遥控车

来源:互联网 发布:java中位数 编辑:程序博客网 时间:2024/04/19 08:35

Description

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

Input

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

Output

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

Sample Input

4 4

Abcd

DeF

AAa

aBccc

Ab

AA

AbC

aBcc

Sample Output

3

5

DataConstraint

Hint

【数据规模】
  对于题目涉及到的字符串严格区分大小写,且长度小于255
  对于20%的数据n≤10,m≤10
  对于40%的数据n≤1000m≤1000
  对于100%的数据n≤10000m≤10000

 

分析:

第一问求前缀为后m个字符串的有多少个(可以重复)。

第二问求fbnc数列。注意第一项是1,第二项是2哦。(要高精)

 

程序:

<span style="font-size:18px;">type arr=array [1..2,1..2] of ansistring;var a,b:arr; n,m:longint; t:array [1..10000] of string;function gjj(x,y:ansistring):ansistring;var i,j,t,s:longint;    z:ansistring; begin  i:=length(x);  j:=length(y);  if i<j then   begin    z:=x;    x:=y;    y:=z;    i:=i xor j;    j:=i xor j;    i:=i xor j;   end;    t:=0; s:=0;  z:='';  while (j>0) do   begin    t:=ord(x[i])+ord(y[j])-48*2+s;    if t>=10 then s:=1             else s:=0;    t:=t mod 10;    z:=chr(t+48)+z;    dec(i); dec(j);   end;  while i>0 do   begin    t:=ord(x[i])-48+s;    if t>=10 then s:=1             else s:=0;    t:=t mod 10;    z:=chr(t+48)+z;    dec(i);   end;   if s>0 then   z:='1'+z;   exit(z); end;function gjc(x,y:ansistring):ansistring;var  t:Array [1..10000] of longint;  i,j:longint; begin gjc:=''; fillchar(t,sizeof(t),0);  for i:=length(x) downto 1 do   for j:=length(y) downto 1 do    begin     t[i+j]:=t[i+j]+(ord(x[i])-48)*(ord(y[j])-48);     t[i+j-1]:=t[i+j-1]+t[i+j] div 10;     t[i+j]:=t[i+j] mod 10;    end;   i:=1;   while (t[i]=0) and (i<10000) do inc(i);   for j:=i to length(x)+length(y) do     gjc:=gjc+chr(t[j]+48); end;function jzcf(a,b:arr):arr;var c:arr;    i,j,k:longint; begin for i:=1 to 2 do  for j:=1 to 2 do   c[i,j]:='0';  for i:=1 to 2 do   for j:=1 to 2 do    for k:=1 to 2 do    begin     c[i,j]:=gjj(c[i,j],gjc(a[i,k],b[k,j]));    end;    jzcf:=c; end;procedure pover(n:longint); begin  if n=1 then exit;  pover(n shr 1);  a:=jzcf(a,a);  if odd(n) then a:=jzcf(a,b); end;procedure fbnc;var i,j,k:longint;    c:arr; begin a[1,1]:='0';a[1,2]:='1'; a[2,1]:='1'; a[2,2]:='1'; b:=a; pover(n); writeln(a[2,2]); end;procedure qsort(l,r:longint);var i,j:longint; key,temp:string;begin if l>=r then exit; i:=l;j:=r; key:=t[l+random(r-l+1)];repeat while  (t[i]<key) do inc(i); while  (t[j]>key) do dec(j); if i<=j then  begin   temp:=t[i];t[i]:=t[j];t[j]:=temp;   inc(i);dec(j);  end;until i>j;qsort(l,j);qsort(i,r);end;procedure main; var i,l,r,mid:longint;     s:string;     ans:longint;  f:boolean;beginreadln(n,m);for i:=1 to n do readln(t[i]);qsort(1,n);ans:=0;f:=false;for i:=1 to m do begin  readln(s);  l:=1; r:=n;  while l<=r do   begin    mid:=(l+r) shr 1;    if t[mid]=s then begin  f:=true; break; end;    if t[mid]<s then     l:=mid+1 else r:=mid-1;   end;   if (copy(t[l],1,length(s))=s) or f then inc(ans); end;writeln(ans);end;begin main; fbnc;end.</span>


0 0