CSES - Bittiparit

Annettuna on bittijono, jossa jokainen merkki on 00 tai 11. Tehtäväsi on laskea summa kaikista bittiparien etäisyyksistä, joissa kumpikin bitti on 11.

Esimerkiksi kun bittijono on 1011010110, etäisyydet ovat seuraavat:

  • 10110\underline{1}0\underline{1}10 (etäisyys 22)
  • 10110\underline{1}01\underline{1}0 (etäisyys 33)
  • 1011010\underline{1}\underline{1}0 (etäisyys 11)

Etäisyyksien summa on siis 2+3+1=62+3+1=6.

Voit olettaa, että bittijonon pituus on enintään 10510^5. Tavoitteena on, että algoritmin aikavaativuus on O(n)O(n).

Python

Toteuta tiedostoon bitpairs.py funktio calculate, joka ilmoittaa etäisyyksien summan.

def calculate(s):
    # TODO

if __name__ == "__main__":
    print(calculate("10110")) # 6
    print(calculate("10")) # 0
    print(calculate("10010110")) # 20
    print(calculate("0011110111101010")) # 214

Java

Toteuta tiedostoon BitPairs.java metodi calculate, joka ilmoittaa etäisyyksien summan.

public class BitPairs {
    public long calculate(String s) {
        // TODO
    }

    public static void main(String[] args) {
        BitPairs b = new BitPairs();
        System.out.println(b.calculate("10110")); // 6
        System.out.println(b.calculate("10")); // 0
        System.out.println(b.calculate("10010110")); // 20
        System.out.println(b.calculate("0011110111101010")); // 214
    }
}