CSES - Datatähti 2016 alku - Results
Submission details
Task:Bittipeli
Sender:testUser
Submission time:2015-10-11 22:11:04 +0300
Language:Java
Status:COMPILE ERROR

Compiler report

input/Bitti.java:161: error: unmappable character for encoding UTF8
            if(Math.abs(valiJono[i]) == 1){ //yksin?inen 1 j?ljell?
                                                   ^
input/Bitti.java:161: error: unmappable character for encoding UTF8
            if(Math.abs(valiJono[i]) == 1){ //yksin?inen 1 j?ljell?
                                                            ^
input/Bitti.java:161: error: unmappable character for encoding UTF8
            if(Math.abs(valiJono[i]) == 1){ //yksin?inen 1 j?ljell?
                                                                  ^
3 errors

Code

/**
 * Created by Frans on 11.10.2015.
 */
public class Bitti {

    static int[] jono;
    static int[] poisto;
    static int pituus;
    static int poistoPituus;
    static String vastaus;
    static boolean possibleWhole;

    static int sarjaTaulukko[];
    static int lyhytBitti;


    public static void main(String[] args) {
        IO io = new IO();

        final char[] line = io.next().toCharArray();
        int length = line.length;

        jono = new int[length+1];
        //poisto = new int[length+10];

        int vanha = 0;
        int vanhaTmp = 0;
        pituus = 0;
        poistoPituus = 0;
        vastaus = "";

        String vastaus2 = "";
        possibleWhole = true;

        boolean poistettu = false;

        int[][] yksinainen = {{0,0},{0,0}};
        int[] yksinainenMaara = {0,0};
        int[][] yksinainenLyhytBitti = {{0,0},{0,0}};

        lyhytBitti =0;
        sarjaTaulukko = new int[length+1];

        stillPossible:
        {

            for (int i = 1; i <= length; i++) {

                int tmpNyt = (int) (line[i - 1]) - 48; // 0 tai 1
                int nyt = tmpNyt * 2 - 1; // -1,-2 tai 1,2


                if (nyt + vanha == 2 || nyt + vanha == -2) {
                    jono[pituus] = nyt * 2;
                } else {

                    //yksinainen loydetty
                    if (jono[pituus]*jono[pituus] == 1){

                        lyhytBitti ++;
                        sarjaTaulukko[pituus] = pituus-lyhytBitti;

                        int yksNyt = 1 - tmpNyt; //vastakkainen kuin nyt
                        yksinainen[yksNyt][yksinainenMaara[yksNyt]]=pituus+1;
                        yksinainenMaara[yksNyt] ++;

                        if (yksinainenMaara[yksNyt] == 2){
                            if (!valiRatkaisu(yksinainen[yksNyt][0], (pituus-1))) {
                                possibleWhole = false;
                                break stillPossible;
                            }
                            jono[pituus -1] = jono[pituus - 1] * 2;
                            pituus = pituus - 1;
                            yksinainenMaara[yksNyt] = 0;
                            lyhytBitti = pituus-sarjaTaulukko[yksinainen[yksNyt][0]-1]-1;
                            //jos yksinainen oli loydetty poistetusta alueesta
                            if (yksinainen[tmpNyt][0]>=yksinainen[yksNyt][0]){
                                yksinainenMaara[tmpNyt] = 0;
                            }
                        }
                    }

                    pituus++;
                    jono[pituus] = nyt;

                }
            /*
            if (pituus >= 3) {

                //lyhmmin patkan poisto
                if (jono[pituus - 2] + jono[pituus - 1] + jono[pituus] == 0) { // 1, -2, 1 or -1, 2, -1
                    poistoPituus++;
                    vastaus = vastaus + (pituus - 1) + " ";
                    jono[pituus - 2] = jono[pituus - 2] * 2;
                    pituus = pituus - 2;
                    poistettu = true;
                }
            }
            */
                vanha = nyt;
                vanhaTmp = tmpNyt;
                sarjaTaulukko[pituus] = pituus-lyhytBitti;
            }

            //silmukan viimeinen lasketaan yksinaiseksi, jos on pariton maara
            if (yksinainenMaara[vanhaTmp]==1){
                if (!valiRatkaisu(yksinainen[vanhaTmp][0], (pituus-1))) {
                    possibleWhole = false;
                    break stillPossible;
                }
                jono[pituus -1] = jono[pituus - 1] * 2;
                pituus = pituus - 1;
                lyhytBitti = pituus-sarjaTaulukko[yksinainen[vanhaTmp][0]-1]-1;
            }

            possibleWhole = valiRatkaisu(1, pituus);

        }

        if (possibleWhole){
            io.println(poistoPituus);
            io.println(vastaus);
        }else{
            io.println("QAQ");
        }

        //io.println(line);
        io.close();


    }


    private static boolean valiRatkaisu(int start, int end){

        int length = end-start+1;
        int[] valiJono = new int[length+1];
        System.arraycopy(jono,start,valiJono,1,length);
        System.arraycopy(jono,end+1,jono,start,pituus-end);
        pituus -= length;

        int poistetutSarjat = 0;

        boolean possible = true;
        for(int i=3; i<=length; i++){
            int a = Math.abs(valiJono[i-1]);
            int b = Math.abs(valiJono[i]+valiJono[i-2]);
            if (Math.abs(valiJono[i-1])==2 && Math.abs(valiJono[i]+valiJono[i-2])==3 ){  // 1, -2, 2 or -2, 2, -1
                poistoPituus ++;
                vastaus = vastaus +(sarjaTaulukko[start+i-2-poistetutSarjat])+ " ";
                System.arraycopy(valiJono,i+1,valiJono,i-1,length-i);
                valiJono[i-2] = -valiJono[i-1]; //muutetaan se arvoksi 2
                //valiJono[length-2] = valiJono[length-2] * 2;
                i = i -2;
                length = length -2;
                poistetutSarjat ++;
            }
        }

        for (int i=1; i<=length; i++){
            if(Math.abs(valiJono[i]) == 1){ //yksinäinen 1 jäljellä
                possible = false;
                break;
            }else{
                poistoPituus ++;
                vastaus = vastaus +(sarjaTaulukko[start-1]+1)+ " ";
            }

        }

        return possible;
    }



}