本地能过但是WA30pts
查看原帖
本地能过但是WA30pts
668379
Poole_tea楼主2024/12/13 19:16
#include <bits/stdc++.h>
using namespace std ;
const int MAXN = 6e4 + 10 ;
struct day {
    int l, r, id ;
}q[MAXN] ;
int a[MAXN], now ;
int cnt[(1 << 26) + 10], belong[MAXN] ;
inline int read() {
	register int x = 0, f = 0;
	register char ch = getchar();
	while (ch < '0' || ch > '9')
		f |= ch == '-', ch = getchar();
	while (ch >= '0' && ch <= '9')
		x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
	return f ? -x : x;
}
inline bool cmp (day a, day b) {
    if (belong[a.l] != belong[b.l]) return belong[a.l] < belong[b.l] ;
    else if (belong[a.l] & 1) return a.r < b.r ;
    else return a.r > b.r ;
}
inline void add(int x) {
    now += cnt[a[x]] ;
    cnt[a[x]]++ ;
    for (int i = 0 ; i <= 25 ; i++) now += cnt[a[x] ^ (1 << i)] ;
}
inline void delet(int x) {
    cnt[a[x]]-- ;
    now -= cnt[a[x]] ;
    for (int i = 0 ; i <= 25 ; i++) now -= cnt[a[x] ^ (1 << i)] ;
}
int ans[MAXN] ;
int main () {
    // freopen("P3604_2.in","r",stdin) ;
    // freopen("P36042.ans","w",stdout) ;
    int n, m ;
    n = read(), m = read() ;
    getchar() ;
    for (int i = 1 ; i <= n ; i++) {
        a[i] = 1 << (getchar() - 'a') ;
        a[i] ^= a[i- 1] ;
    }
    for (int i = 1 ; i <= m ; i++) {
        q[i].l = read(), q[i].r = read() ;
        q[i].id = i ;
    }
    int len = pow(n, 2.0 / 3.0), num = ceil((double)n / len) ;
    for (int i = 1 ; i <= num ; i++){
        for (int j = (i - 1) * len + 1 ; j <= i * len ; j++) belong[j] = i ;
    }
    sort(q + 1, q + m + 1, cmp) ; 
    int l = 1, r = 0 ;
    for (int i = 1 ; i <= m ; i++) {
        int x = q[i].l - 1, y = q[i].r ;
        while (l < x) delet(l++) ;
        while (l > x) add(--l) ;
        while (r < y) add(++r) ;
        while (r > y) delet(r--) ;
        ans[q[i].id] = now ;
    }
    for (int i = 1 ; i <= m ; i++) printf("%d\n", ans[i]) ;
}
2024/12/13 19:16
加载中...