遥控车

Description

  平平带着韵韵来到了游乐园,看到了n 辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i]。韵韵早就迫不及待地想玩名字是s 的遥控车。可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀(也就是说能确定一个i,使s name[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;
begin
readln(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值