/ Vijos / 题库 / FBI树 /

题解

157 条题解

  • 0
    @ 2009-10-27 11:20:17

    var

    m,i,j,k,l,t:longint;

    s,s1:ansistring;

    w1,w0:longint;

    n:array[1..11]of longint;

    begin

    readln(m);

    readln(s);

    n[1]:=1;

    for i:=2 to m+1 do

    n[i]:=n*2;

    for i:=1 to n[m+1] do

    for k:=1 to m+1 do

    begin if i mod n[k]=0

    then begin s1:=copy(s,i-n[k]+1,n[k]);

    w0:=0;

    w1:=0;

    for j:=1 to n[k] do

    begin

    if s1[j]='0'

    then inc(w0);

    if s1[j]='1'

    then inc(w1);

    end;

    if w0>0

    then if w1>0

    then write('F')

    else write('B')

    else write('I');

    end;

    end;

    writeln;

    end.

  • 0
    @ 2009-10-22 11:19:46
  • 0
    @ 2009-10-19 23:23:19

    第一次用GUIDE写 代码写丑了

    类似线段树

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    const

    c:array[0..2]of char=('B','I','F');

    var

    m,n,i,j,k,p:longint;

    t:array[1..5000]of longint;

    s:ansistring;

    procedure build(i,l,r:longint);

    var m:longint;

    begin

    if l=r then

    begin

    t[i]:=ord(s[l])-48;

    exit;

    end;

    m:=(l+r)shr 1;

    build(i shl 1, l,m);

    build(i shl 1+1,m+1,r);

    if (t[i shl 1]=0)and(t[i shl 1+1]=0) then t[i]:=0

    else if (t[i shl 1]=1)and(t[i shl 1+1]=1)then t[i]:=1

    else t[i]:=2;

    end;

    function ask(i,l,r:longint):ansistring;

    var m:longint;

    begin

    if l=r then exit(c[t[i]]);

    m:=(l+r)shr 1;

    exit(ask(i shl 1,l,m)+ask(i shl 1+1,m+1,r)+c[t[i]]);

    end;

    procedure init;

    begin

    readln(m);

    readln(s);

    end;

    procedure main;

    begin

    build(1,1,length(s));

    writeln(ask(1,1,length(s)));

    end;

    begin

    init;

    main;

    end.

  • 0
    @ 2009-10-18 08:46:33

    汗,用string WA了两次

    var

    a:array[1..10000] of char;

    s:ansistring;

    n,i,k:longint;

    fbi:set of char;

    procedure creat(x,h,t:longint);

    var b0,b1:boolean; i:longint;

    begin

    b0:=true; b1:=true;

    for i:=h to t do begin if s[i]'0' then b0:=false; if s[i]'1' then b1:=false; end;

    if b0 then a[x]:='B'

    else if b1 then a[x]:='I'

    else a[x]:='F';

    if h

  • 0
    @ 2009-10-11 13:00:01

    program vj1114;

    var n:longint;

    a:ansistring;

    function work(x:ansistring):longint;

    begin

    if x='1' then work:=1

    else if x='0' then work:=2

    else work:=work(copy(x,1,length(x) div 2)) or

    work(copy(x,length(x) div 2+1,(length(x)+1) div 2));

    case work of

    1:write('I');

    2:write('B');

    3:write('F');

    end;

    end;

    begin

    readln(n);

    readln(a);

    work(a);

    writeln;

    end.

    第一次发现 function 可以当procedure 调用

  • 0
    @ 2009-10-08 15:19:42

    var

    i,j,k,n,p:integer;

    a:array[1..10000] of integer;

    s:string;

    procedure try(t:integer);

    begin

    if t*2

  • 0
    @ 2009-10-05 20:26:38

    program fbi;

    var i,n,k:longint;

    ch:array[1..300000]of char;

    function what(f,t:longint):char;

    var h0,h1:longint;

    begin

    h0:=0; h1:=0;

    for i:=f to t do if ch[i]='0' then inc(h0) else inc(h1);

    if (h1>0)and(h0>0) then what:='F'

    else if h1>0 then what:='I'

    else if h0>0 then what:='B';

    end;

    procedure dfs(f,t:longint);

    var mid:longint;

    begin

    mid:=(f+t)div 2;

    if t-f>0 then begin dfs(f,mid); dfs(mid+1,t) end;

    write(what(f,t));

    end;

    begin (*Main*)

    readln(n);

    k:=1;

    for i:=1 to n do k:=k*2;

    for i:=1 to k do read(ch[i]);

    dfs(1,k);

    writeln;

    end.

  • 0
    @ 2009-09-24 14:07:46

    编译通过...

    ├ 测试数据 01:答案错误...

     ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案错误...

     ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案错误...

     ├ 标准行输出

     ├ 错误行输出

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:70 有效耗时:0ms

    用字符串表示FBI树的前序遍历,然后dfs后序遍历,竟然错了3个。

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    郁闷………………………………

    没考虑只有一个数的情况。

    讨厌的FP无法跟踪ansistring,调试时换了string,提交时忘记改回来了。

    又浪费了AC率吖………………

  • 0
    @ 2009-09-21 12:55:19

    var

    n,i,j:longint;

    s:ansistring;

    procedure make(s:string);

    var p0,p1,l:longint;

    begin

    p0:=pos('0',s);

    p1:=pos('1',s);

    l:=length(s);

    if l1 then begin

    make(copy(s,1,l div 2));

    make(copy(s,l div 2+1,l div 2));

    end;

    if (p00) and(p1=0) then write('B')

    else if (p00) and (p10) then write('F')

    else if (p0=0) and (p10) then write('I');

    end;

    begin

    readln(n);

    readln(s);

    make(s);

    end.

  • 0
    @ 2009-09-17 18:17:23

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-09-13 11:15:29

    简单模拟呵呵~~

    program ex;

    var

    n,i:integer;

    w:array[1..11]of integer;

    f:packed array[1..11,1..2]of ansistring;

    t:ansistring;

    begin

    readln(n);

    n:=n+1;

    readln(t);

    if n=1 then if t='1' then write('I') else write('B') else

    repeat

    if t[1]='1' then f[n,1]:='I' else f[n,1]:='B';w[n]:=w[n]+1;write(f[n,1]);

    if t[2]='1' then f[n,2]:='I' else f[n,2]:='B';w[n]:=w[n]+1;write(f[n,2]);

    for i:=n downto 1 do

    if w[i]=2 then begin w:=w+1;

    if ff then f[i-1,w]:='F' else f[i-1,w]:=f;

    write(f[i-1,w]);

    w[i]:=0;end;

    delete(t,1,2);

    until(length(t)=0);

    end.

  • 0
    @ 2009-09-12 19:51:37

    为什么?

    鄙菜没读懂题目……

    什么递归啊……

    我悲剧了……

  • 0
    @ 2009-09-12 10:49:22

    不用树结构,递归秒杀

    program fbi;

    var s,r:ansistring;

    a,i,j,n:integer;

    function ret(s:ansistring):char;

    var i:integer;

    begin

    case s[1]of

    '0':ret:='B';

    '1':ret:='I';

    end;

    for i:=length(s) downto 1 do

    if s[i]s[1] then exit('F');

    end;

    procedure visit(s:ansistring);

    begin

    r:=ret(s)+r;

    if length(s)1 then

    begin

    visit(copy(s,length(s) div 2+1,length(s) div 2));

    visit(copy(s,1,length(s) div 2));

    end;

    end;

    begin

    readln(n);

    readln(s);

    r:='';

    visit(s);

    writeln(r);

    end.

  • 0
    @ 2009-09-11 16:51:54

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    type bitree=^biq;

    biq=record

    data:char;

    left:bitree;

    right:bitree;

    end;

    var n,x,i:longint; st:ansistring; node:bitree;

    procedure zhao(var bit:bitree; l,r:longint);

    var a,b,i,mid:longint;

    begin

    mid:=(l+r) div 2;

    a:=0;

    b:=0;

    new(bit);

    for i:=l to r do if st[i]='1' then a:=1 else b:=1;

    if (a=1)and(b=1) then bit^.data:='F'

    else if a=1 then bit^.data:='I' else bit^.data:='B';

    if lr then

    begin

    zhao(bit^.left,l,mid);

    zhao(bit^.right,mid+1,r);

    end;

    end;

    procedure bianli(bit:bitree);

    begin

    if bitnil then

    begin

    bianli(bit^.left);

    bianli(bit^.right);

    write(bit^.data);

    end;

    end;

    begin

    readln(n);

    x:=1;

    for i:=1 to n do x:=x*2;

    readln(st);

    new(node);

    node^.left:=nil;

    node^.right:=nil;

    zhao(node,1,x);

    bianli(node);

    end.

    用ansistring!

  • 0
    @ 2009-09-05 19:39:58

    老老实实解题--

    本题算法主要是两个步骤1是建树,2是输出

    1.二分法递归建树:有人可能会想到每次二分后扫描一遍数组,看是否全是1或全是0,这样的速度太慢,我们可以用G[i]来表示从开头到第i个数时‘1’的个数,这样就可以通过1的个数来判断区间[l,r]上是否满足全‘1’或全‘0’。也即,对于区间[l,r],其中l为左边界,r为右边界:

    若G[r]-G[l-1]=r-l+1则表示区间上全部是1,则tree[i]= ’I’;

    若G[r]-G[l-1]=0 则表示区间上全部是0,则tree[i]= ’B’;

    其他情况都是’F’。

    2.按后序遍历输出序列:

    即按左子树,右子树,根的顺序递归输出,具体见参考程序。

    要注意输出的总个数为2^(n+1)-1

  • 0
    @ 2009-09-03 18:32:26

    l:=length(st);

    if l >= 2 then

    begin

    maketree(copy(st,1,l div 2));

    maketree(copy(st,l div 2 + 1,l));

    write(appletype(st));

    exit;

    end;

    write(appletype(st));

  • 0
    @ 2009-08-30 23:46:21

    无聊题目。。15行搞定。。

    n直接忽略掉吧。。s记得ansi。。其他没了。。

    var s:ansistring;

    procedure print(s:ansistring);

    var i:longint;

    begin

    if s='' then exit;

    print(copy(s,1,length(s) shr 1));

    print(copy(s,length(s) shr 1+1,length(s) shr 1));

    if pos('0',s)=0 then write('I') else

    if pos('1',s)=0 then write('B') else write('F');

    end;

    begin

    readln; //为什么不把重点放前面。。

    readln(s);

    print(s);

    end.

  • 0
    @ 2009-08-18 17:20:33

    var

    n:integer;

    s:ansistring;

    procedure try(ss:ansistring;k:longint);

    begin

    if k=1 then

    begin

    if ss[k]='1' then write('I')

    else write('B');

    exit;

    end;

    try(copy(ss,1,k div 2),k div 2);

    try(copy(ss,k div 2+1,k div 2),k div 2);

    if (pos('0',ss)0)and(pos('1',ss)0)

    then write('F')

    else if pos('0',ss)0

    then write('B')

    else write('I');

    end;

    begin

    readln(n);

    readln(s);

    try(s,length(s));

    end.

  • 0
    @ 2009-08-15 16:17:50

    var

    n:longint;

    s:ansistring;

    function work(s1:ansistring):ansistring;

    var

    m,i,j:longint;

    begin

    m:=length(s1);

    if m=0 then exit;

    if m=1 then

    begin

    if s1='1'then write('I')

    else write('B');

    exit;

    end;

    work(copy(s1,1,m div 2));

    work(copy(s1,m div 2+1,m div 2));

    i:=pos('1',s1);

    j:=pos('0',s1);

    if i=0 then write('B')

    else

    if j=0 then write('I')

    else write('F');

    end;

    begin

    readln(n);

    readln(s);

    writeln(work(s));

    end.

    一次AC……

  • 0
    @ 2009-08-13 15:52:13

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    特别要注意 输出时 F,B,I 要大写。不然一定0分

信息

ID
1114
难度
3
分类
数据结构 | 点击显示
标签
递交数
4162
已通过
2223
通过率
53%
被复制
26
上传者