BOJ 3997 - 하이퍼드롬

image.png

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

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

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

짝수라면 2626개의 알파벳이 11개이고 나머지는 모두 00인 것의 개수를 세주면 된다.

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