A
用scanf("%s")就会WA..不知道为什么
/*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_back using namespace std; typedef long long ll; typedef unsigned long long ull; const int dir[8][2] = {{0, 1}, {1, 0}, {0, -1}, { -1, 0}, {1, 1}, {1, -1}, { -1, -1}, { -1, 1}}; const int mod = 1e9 + 7; const int gakki = 5 + 2 + 1 + 19880611 + 1e9; const int N = 3e5 + 5; int preE[N]; int preW[N]; string f; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; cin >> f; preE[0] = preW[0] = 0; for (int i = 1; i <= n; i++) { if (f[i - 1] == 'W') { preW[i] = preW[i - 1] + 1; preE[i] = preE[i - 1]; } else { preE[i] = preE[i - 1] + 1; preW[i] = preW[i - 1]; } } ll anser = INT_MAX; ll now; for (int i = 1; i <= n; i++) { now = preW[i - 1] - preW[0]; now += preE[n] - preE[i]; anser = min(anser, now); } cout << anser << endl; return 0; }
B
题意:给你N个非负数(1e5) 要求你求出有多少个区间内 区间和等于区间亦或和 给的数小于220
解:
①:
因为XOR操作中 0^0=0 1^1=0 0^1=1 如果两个数相加有进位操作的话 肯定会损失值
所以我们把0特殊化 直接暴力 如果有位数重复的就不成立 所以每次查询的区间长度不会超过20
复杂度为1e6左右
/*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_back using namespace std; typedef long long ll; typedef unsigned long long ull; const int dir[8][2] = {{0, 1}, {1, 0}, {0, -1}, { -1, 0}, {1, 1}, {1, -1}, { -1, -1}, { -1, 1}}; const int mod = 1e9 + 7; const int gakki = 5 + 2 + 1 + 19880611 + 1e9; const int N = 2e5 + 5; ll num[N]; int last = 0; int Left[N]; ll yihuo; ll pre; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; ll anser = 0; for (int i = 1; i <= n; i++) { cin >> num[i]; Left[i] = last; if (num[i]) { last = i; } } ll now; ll i, j; for (i = 1; i <= n; i++) { yihuo = pre = num[i]; for (j = Left[i]; j >= 1;j = Left[j]) { yihuo = yihuo ^ num[j]; pre += num[j]; if (yihuo != pre) { break; } } anser+=i-j; } cout << anser << endl; return 0; }