panthema / 2012 / 1119-eSAIS-Inducing-Suffix-and-LCP-Arrays-in-External-Memory / eSAIS-DC3-LCP-0.5.2 / src / input / skyline.h (Download File)
/******************************************************************************
 * src/input/skyline.h
 *
 * Algorithm to generate worst-case input for SAIS and divsufsort as a stream.
 *
 ******************************************************************************
 * Copyright (C) 2012 Timo Bingmann <tb@panthema.net>
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation, either version 3 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 *****************************************************************************/

namespace skyline {

template <typename Container>
void generate(Container& out)
{
    if (out.size() == 0) return;

    size_t len = out.size();

    size_t log2len = ceil( log(len+1) / log(2) );

    for (size_t i = 0; i < len; ++i)
    {
        // count number of least-significant binary zeros in i+1
        size_t j = i+1;

        unsigned int zc = 0;
        while ( (j & 1) == 0 ) {
            zc++; j >>= 1;
            assert( j != 0 );
        }

        zc = std::min<size_t>(zc, log2len - 1); // repeat a if size is not a power of 2

        out[i] = 'a' + (log2len - zc - 1);
        //std::cout << i << " : " << (out[i] - 'a') << " - " << out[i] << "\n";
    }
}

} // namespace skyline