CSES - Datatähti 2016 alku - Results
Submission details
Task:Kirjat
Sender:KARHU
Submission time:2015-10-06 16:50:42 +0300
Language:C++
Status:COMPILE ERROR

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:18:13: error: 'i' was not declared in this scope
         for(i = 0; i < maara; ++i)
             ^
input/code.cpp:23:13: error: 'i' was not declared in this scope
         for(i = 0; i < maara; ++i)
             ^

Code

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// g++ ...
#define __STDC_FORMAT_MACROS
#include <inttypes.h>

int main()
{
    int maara;
    int *uolevi, *maija, *kaaleppi, *vaihto;
    int virhe = 0;

    if(fscanf(stdin, "%d", &maara) > 0)
    {
        uolevi = (int*)malloc(maara * sizeof(int));
        for(i = 0; i < maara; ++i)
            if(fscanf(stdin, "%d", &uolevi[i]) < 0)
                break;

        maija = (int*)malloc(maara * sizeof(int));
        for(i = 0; i < maara; ++i)
            if(fscanf(stdin, "%d", &maija[i]) < 0)
                break;

        kaaleppi = (int*)malloc(maara * sizeof(int));
        vaihto = (int*)malloc(maara * sizeof(int));
    } else
        virhe = 1;

    if(!virhe)
    {
        int i, j;
        // kierrätä uolevin kirjajoukkoa, tallenna käyttämättä 
        // jääneet epäsopivat luvut
        for(i = 0, j = 1; i < maara - (j - 1); ++i)
        {
            kaaleppi[i] = uolevi[(i + j) % maara];
            if(kaaleppi[i] == maija[i])
            {
                virhe = 1;
                vaihto[j - 1] = kaaleppi[i];
                --i;
                ++j;
            }
        }

        if(virhe)
        {
            int k, l, m, n;
            int *kohdat = (int*)malloc(maara * sizeof(int));

            // kierrätä käyttämättä jääneiden lukujen joukkoa
            for(k = 0, l = 0; k < j - 1; ++k)
            {
                kaaleppi[i + k] = vaihto[(k + l) % j];
                if(kaaleppi[i + k] == maija[i + k])
                {
                    k = 0;
                    ++l;
                }
            }

            // jos vielä virheitä, vaihda näissä kohdissa olevien lukujen 
            // paikkoja keskenään, kunnes ratkaisu löytyy
uudestaan:
            for(i = 0, m = 0; i < maara; ++i)
            {
                if(kaaleppi[i] == uolevi[i] || kaaleppi[i] == maija[i])
                {
                    kohdat[m] = i;
                    ++m;
                }
            }

            if(m == 0)
                goto valmis;

            for(i = 0, n = 0; i < m + 1; ++i)
                kaaleppi[kohdat[i]] = kaaleppi[kohdat[(i + n) % (m + 1)]];

            goto uudestaan;

valmis:
            virhe = 0;
        }

        for(i = 0; i < maara; ++i)
            printf("%u ", kaaleppi[i]);

        free(uolevi);
        free(maija);
        free(kaaleppi);
        free(vaihto);
    }
    
    return virhe;
}