平平带着韵韵来到了游乐园,看到了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
第一行输出韵韵能玩的次数。第二行输出共有多少种可能的排列。
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≤1000,m≤1000;
对于100%的数据n≤10000,m≤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>