вы забыли указать sed -r, чтобы включить поддержку регулярных выражений
The only difference between basic and extended regular expressions is in
the behavior of a few characters: `?', `+', parentheses, braces (`{}'),
and `|'. While basic regular expressions require these to be escaped
if you want them to behave as special characters, when using extended
regular expressions you must escape them if you want them _to match a
literal character_. `|' is special here because `\|' is a GNU
extension - standard basic regular expressions do not provide its
functionality.
Вариант покороче:
...for (int i = 0; i < s.length(); i++) a[idx++] = s[i] - '0';
То, что в языках со статической типизацией выявляет компилятор еще до первого запуска программы, в языках с динамической типизацией может вылезти боком даже через полгода после запуска в эксплуатацию.
Не понял принцип группирования. Какая-то противоречивая муть. Как там могут буквы В и Д образовывать одну группу? Тогда уж А и В должны образовывать одну группу. Либо оно изначально такое, либо ты его так описал сюда.