CSES - Bittiparit

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

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

  • \underline{1}0\underline{1}10 (etäisyys 2)
  • \underline{1}01\underline{1}0 (etäisyys 3)
  • 10\underline{1}\underline{1}0 (etäisyys 1)

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

Voit olettaa, että bittijonon pituus on enintään 10^5. Tavoitteena on, että algoritmin aikavaativuus on 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
    }
}