árbol NOIP2004T3FBI informe de resolución de problemas

Ver el título original Luo Valley ( https://www.luogu.org/problem/show?pid=1087 )
que puede poner un "0" y "1" componentes de cadena se clasifican en tres categorías: los "0", dicha cadena B cadena es la cadena, todo secuencia llamada cadena "1" I, contiene tanto "0" y contiene "1" se refiere como la serie F.

árbol FBI es un árbol binario, también incluye un tipo de nodo linfáticos F, B y el nodo I nodo tres. Una longitud de 2 ^ N "01" en una cadena S se puede construir FBI árbol T, construido de forma recursiva como sigue:

1) T es el nodo raíz R, del mismo tipo y del tipo de cadena de S;

2) Si una mayor longitud de recorrido de S, la cadena s raya en medio se divide en subcadenas izquierdo y derecho de la misma longitud S1 y S2; T1 dejó por la estructura subárbol izquierdo R es subcadena S1, S2 por las subcadenas correctas en la configuración R derecho subárbol T2.

Ahora dada una longitud de 2 ^ N "01" serie, construir el método de construcción del árbol FBI se ha descrito anteriormente una, y la emite postorden traversal secuencia.

En primer lugar consideramos que es el recorrido de orden, que es recorrer el subárbol izquierdo, a continuación, recorrer el subárbol derecho, entonces el padre de recorrido.
Así que a continuación, dividir y conquistar proceso recursivo puede seleccionarse (l, l + (rl) / 2) y (1 + l + (rl) / 2, r) en ambos casos.
El primero es el subárbol izquierdo, el segundo es el subárbol derecho.
Recursivo para una sola vez es L == r cuando se alcanza el valor límite.
Podemos acabar con la salida cambiada recursiva.
Varios tmp representado por un 0
con un tmp1 1 representa unos cuantos
que sabemos
cuando tmp = 0, 0 0, lo que indica que toda la subcadena 1, la salida I
A la inversa, cuando el tiempo tmp1 = 0, 1 tiene 0, indica que la subcadena son todos 0, la salida B
cuando tmp = 0 y tmp1 = 0 cuando hay una subcadena ambos 0, la salida F !!.
código es el siguiente:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;

const int maxn=10000;
int n,a1[maxn<<1],l;
char a[maxn<<1];

void work(int l,int r){
    if(l<r){
        work(l,l+(r-l)/2);
        work(1+l+(r-l)/2,r);
    }
    int cnt=0;
    int cnt1=0;
    for(int i=l;i<=r;i++){
        if(a1[i]){
            cnt1++;
        }
        else{
            cnt++;
        }
    }
    if(!cnt){
        printf("I");
    }
    else if(!cnt1){
        printf("B");
    }
    else{
        printf("F");
    }
}

int main(){
    scanf("%d",&n);
    scanf("%s",&a[1]);
    l=strlen(&a[1]);
    for(int i=1;i<=l;i++){
        a1[i]=a[i]-'0';
    }   
    work(1,l);
    return 0;   
}
Publicado 41 artículos originales · ganado elogios 58 · Vistas a 60000 +

Supongo que te gusta

Origin blog.csdn.net/a1351937368/article/details/78001903
Recomendado
Clasificación