BOJ 3997 - 하이퍼드롬

image.png

홀수, 짝수 팰린드롬을 따로 생각해준다.

짝수가 되려면 $i$번째에서 자신의 왼쪽으로 $j$ 번째 알파벳이 짝수면 $2^j=0$, 홀수면 $2^j=1$ 이 되는 parity 들의 집합을 구간합 배열로 카운팅해둔다.

그럼 현재 $0 \to i$ 까지의 parity를 $K$라고 하면 이전까지의 구간합 배열의 값 중 $K$ 와 일치하는 것이 있으면 그 구간은 하나의 팰린드롬이라고 볼 수 있다.

짝수라면 $26$개의 알파벳이 $1$개이고 나머지는 모두 $0$인 것의 개수를 세주면 된다.

int idx(char c) {
   if (c >= 'a' && c <= 'z') return c - 'a';
   return c - 'A' + 26;
}
void solve() {
   map<int, int> cnt;
   int n;
   cin >> n;
   string s;
   cin >> s;
   cnt[0]++;
   int bit = 0;
   int ans = 0;
   for (int i = 0; i < n; i++) {
      bit ^= (1ll << idx(s[i]));
      ans += cnt[bit];
      cnt[bit]++;
   }
   bit = 0;
   cnt.clear();
   cnt[0]++;
   for (int i = 0; i < n; i++) {
      bit ^= (1ll << idx(s[i]));
      // center char
      for (int j = 0; j < 52; j++) {
         int t = bit ^ (1ll << j);
         if (hass(cnt, t))
            ans += cnt[t];
      }
      cnt[bit]++;
   }
   cout << ans;
}

Tags:

Categories:

Updated:

Comments