def combine_biluo(tokens: list[str], tags: list[str]) -> tuple[list[str], list[str]]:
    """
    Combines multi-token BILUO tags into single entities.

    Parameters
    ----------
    tokens : list[str]
        Input tokenized string.
    tags : list[str]
        Tags corresponding with each token with BILUO format.

    Returns
    -------
    tuple[list[str], list[str]]:
        Tokens and tags with BILUO removed.

    Example
    -------

    >>> tokens = ['New', 'York', 'City', 'is', 'big', '.']
    >>> tags = ['B-PLACE', 'I-PLACE', 'L-City', 'O', 'O', 'O']
    >>> tokens, tags = combine_biluo(tokens, tags)

    >>> tokens
    ['New York City', 'is', 'big', '.']
    >>> tags
    ['PLACE', 'O', 'O', 'O']
    """
    tokens_biluo = tokens.copy()
    tags_biluo = tags.copy()

    for idx, tag in enumerate(tags_biluo):
        if idx + 1 < len(tags_biluo) and tag[0] == "B":
            i = 1
            while tags_biluo[idx + i][0] not in ["B", "O"]:
                tokens_biluo[idx] = tokens_biluo[idx] + " " + tokens_biluo[idx + i]
                i += 1
                if idx + i == len(tokens_biluo):
                    break

    zipped = [
        (token, tag)
        for (token, tag) in zip(tokens_biluo, tags_biluo)
        if tag[0] not in ["I", "L"]
    ]
    if list(zipped):
        tokens_biluo, tags_biluo = zip(*zipped)
        tags_biluo = [tag[2:] if tag != "O" else tag for tag in tags_biluo]
        return list(tokens_biluo), tags_biluo
    else:
        return [], []