A. Everyone Loves Playing Games
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- const int N = 1e4 + 5;
- int n, m;
- struct LB
- {
- ll b[65];
- void clear() { memset(b, 0, sizeof(b)); }
- void ins(ll x)
- {
- for(int i=62; i>=0; i--)
- if((x>>i)&1)
- {
- if(!b[i])
- {
- b[i] = x;
- return;
- }
- x ^= b[i];
- }
- }
- }A, B;
- void solve()
- {
- scanf("%d%d", &n, &m);
- ll X = 0;
- A.clear(), B.clear();
- for(int i=1; i<=n; i++)
- {
- ll x, y; scanf("%lld%lld", &x, &y);
- X ^= x;
- A.ins(x^y);
- }
- for(int i=1; i<=m; i++)
- {
- ll x, y; scanf("%lld%lld", &x, &y);
- X ^= x;
- B.ins(x^y);
- }
- ll ans = X;
- for(int i=62; i>=0; i--)
- {
- if(!A.b[i] && !B.b[i]) continue;
- if(!A.b[i]) ans = min(ans, ans^B.b[i]);
- else if(!B.b[i]) ans = max(ans, ans^A.b[i]);
- else
- {
- if((ans>>i)&1) ans ^= A.b[i];
- A.ins(A.b[i]^B.b[i]);
- }
- }
- printf("%lld\n", ans);
- }
- int main()
- {
- int _; scanf("%d", &_);
- while(_--) solve();
- return 0;
- }
D. String Theory
- #include<bits/stdc++.h>
- using namespace std ;
- const int maxn = 3e5 + 10 ;
- struct Sa
- {
- int rk[maxn << 1] , sa[maxn << 1] , height[maxn << 1] ;
- int tmp[maxn << 1] , cnt[maxn] ;
- char s[maxn] ;
- int st[maxn][25] ;
- void cal(int n , int m)
- {
- n ++ ;
- for(int i = 0 ; i < n * 2 + 5 ; i ++)
- rk[i] = sa[i] = height[i] = tmp[i] = 0 ;
- for(int i = 0 ; i < m ; i ++) cnt[i] = 0 ;
- for(int i = 0 ; i < n ; i ++) cnt[rk[i] = s[i]] ++ ;
- for(int i = 1 ; i < m ; i ++) cnt[i] += cnt[i - 1] ;
- for(int i = 0 ; i < n ; i ++) sa[-- cnt[rk[i]]] = i ;
- for(int k = 1 ; k <= n ; k <<= 1)
- {
- int j = 0 ;
- for(int i = 0 ; i < n ; i ++)
- {
- j = sa[i] - k ;
- if(j < 0) j += n ;
- tmp[cnt[rk[j]] ++] = j ;
- }
- sa[tmp[cnt[0] = 0]] = j = 0 ;
- for(int i = 1 ; i < n ; i ++)
- {
- if(rk[tmp[i]] != rk[tmp[i - 1]]
- || rk[tmp[i] + k] != rk[tmp[i - 1] + k])
- cnt[++ j] = i ;
- sa[tmp[i]] = j ;
- }
- memcpy(rk , sa , n * sizeof(int)) ;
- memcpy(sa , tmp , n * sizeof(int)) ;
- if(j >= n - 1) break ;
- }
- height[0] = 0 ;
- for(int i = 0 , k = 0 , j = rk[0] ; i < n - 1 ; i ++ , k ++)
- while(~k && s[i] != s[sa[j - 1] + k])
- height[j] = k -- , j = rk[sa[j] + 1] ;
- }
- void build_lcp(int n)
- {
- for(int i = 1 ; i <= n ; i ++) st[i][0] = height[i] ;
- for(int j = 1 ; j <= 20 ; j ++)
- for(int i = 1 ; i + (1 << j) - 1 <= n ; i ++)
- st[i][j] = min(st[i][j - 1] , st[i + (1 << (j - 1))][j - 1]) ;
- }
- int lcp(int l , int r)
- {
- if(l > r) swap(l , r) ;
- l ++ ;
- int len = log2(r - l + 1) ;
- return min(st[l][len] , st[r - (1 << len) + 1][len]) ;
- }
- } sa[2] ;
- int main()
- {
- std::ios::sync_with_stdio(false) , cin.tie(0) ;
- int T ;
- cin >> T ;
- while(T --)
- {
- int k ;
- cin >> k ;
- cin >> sa[0].s ;
- int len = strlen(sa[0].s) ;
- if(k == 1)
- {
- cout << 1ll * len * (len + 1) / 2 << '\n' ;
- continue ;
- }
- for(int i = 0 ; i < len ; i ++) sa[1].s[i] = sa[0].s[len - 1 - i] ;
- sa[0].cal(len , 200) ;
- sa[0].build_lcp(len) ;
- sa[1].cal(len , 200) ;
- sa[1].build_lcp(len) ;
- auto rev = [&](int x)
- {
- return len - 1 - x ;
- } ;
- long long ans = 0 ;
- for(int i = 1 ; i <= len / k ; i ++)
- {
- for(int j = 0 ; j < len ; j += i)
- {
- int p = j ;
- while(p + i < len && sa[0].lcp(sa[0].rk[p] , sa[0].rk[p + i]) >= i) p += i ;
- if(p + i - 1 <= len - 1 && (p == j || sa[0].lcp(sa[0].rk[j] , sa[0].rk[p]) >= i)) p += i ;
- if((p - j) / i >= k - 1)
- {
- int x = p ;
- int lcp1 = 0 ;
- if(x < len) lcp1 = sa[0].lcp(sa[0].rk[j] , sa[0].rk[x]) ;
- int y = j - 1 ;
- int lcp2 = 0 ;
- if(y >= 0) lcp2 = sa[1].lcp(sa[1].rk[rev(j - 1)] , sa[1].rk[rev(j + i - 1)]) ;
- ans += max(0 , lcp1 + lcp2 + p - j - i * k + 1) ;
- }
- if(p > j) j = p - i ;
- }
- }
- cout << ans << '\n' ;
- }
- return 0 ;
- }
J. Gaokao
- #include <iostream>
- using namespace std;
- long long count(long long a)
- {
- long long count = 0;
- while(a)
- {
- if(a % 2 == 1)
- {
- count++;
- }
- a /= 2;
- }
- return count;
- }
- int main(){
- int t;
- long long n;
- cin >> t;
- while(t--){
- cin >> n;
- cout << (1ll << count(n - 1)) << endl;
- }
- return 0;
- }