leetcode :
数据范围比较小,按题意模拟
class Solution {
public:
vector<vector<int>> largestLocal(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
int x = (n - 2) * (n - 2);
vector<vector<int>> ans(n - 2, vector<int>(m - n));
int res = 0, bsd = 0, idex = 0;
while(x --){
int gh = 0;
for(int i = res; i < res + 3; i ++){
for(int j = bsd; j < bsd + 3; j ++){
gh = max(grid[i][j], gh);
}
}
ans[idex].push_back(gh);
bsd ++;
if(bsd + 2 >= n){
bsd = 0;
res ++;
idex ++;
}
}
return ans;
}
};
看到图就直接想 bfs() 了,其实根本没有必要,
然后就是注意,又爆 int 了
class Solution {
public:
int edgeScore(vector<int>& edges) {
unordered_map<int, vector<int>> ans;
map<long, long> gh;
queue<int> res;
for(int i = 0; i < edges.size(); i ++){
ans[i].push_back(edges[i]);
res.push(i);
}
while(!res.empty()){
int t = res.front();
res.pop();
for(auto c : ans[t]){
gh[c] += t;
}
}
int zhon = -1, w;
for(auto [x, y] : gh){
if(y > zhon){
w = x;
zhon = y;
}
}
return w;
}
};
直接模拟即可
class Solution {
public:
int edgeScore(vector<int>& edges) {
int n = edges.size();
vector<long long> f(n);
for (int i = 0; i < n; i++) f[edges[i]] += i;
int ans = 0;
for (int i = 1; i < n; i++) if (f[i] > f[ans]) ans = i;
return ans;
}
};
贪心,我们在遇到连续的 ’I‘ 时,只需依次赋加一值;再遇到连续的 ’D‘ 时,再其结束的后一位 ’I‘开始,依次往前赋加一值
举个例子 “I I I D D I D I"
我们按上述贪心思路分成三段 ”I I I" “D D I” “D I”
依次赋值 “1 2 3” “6 4 5” “8 7” 最后加上 9 即是答案
class Solution {
public:
string smallestNumber(string pattern) {
int n = pattern.size(), i = 0;
char res = '1';
string ans(n + 1, 0);
while(i < n){
if(i && pattern[i] == 'I') i ++;
while(i < n && pattern[i] == 'I') ans[i ++] = res ++;
int j = i;
while(i < n && pattern[i] == 'D') i ++;
for(int k = i; k >= j; k --) ans[k] = res ++;
}
return ans;
}
};
acwing :
模拟即可
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
while(n --){
string x;
cin >> x;
if(x[x.size() - 1] == 'o' && x[x.size() - 2] == 'p') cout << "FILIPINO" << endl;
else if(x[x.size() - 1] == 'a' && x[x.size() - 2] == 'd' && x[x.size() - 3] == 'i' && x[x.size() - 4] == 'n' &&
x[x.size() - 5] == 'm'){
cout << "KOREAN" << endl;
}
else cout << "JAPANESE" << endl;
}
return 0;
}
s[ i ]表示前 i 个字母的异或前缀和,求[ i ~ j ]这一段的异或和: s[ j ] ^ s[ i - 1 ]
该连续子数组的前一半元素的异或和等于其后一半元素的异或和,说明 左半边 ^ 右半边 = 0
可以使用哈希表来记录之前的异或前缀和的值出现的次数
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
unordered_map<int, int> a, b;
long long sum = 0, ans = 0;
b[0] ++;
for(int i = 1; i <= n; i ++){
int x;
cin >> x;
sum ^= x;
if(i & 1) ans += a[sum] ++;
else ans += b[sum] ++;
}
cout << ans << endl;
return 0;
}