AcWing第64场周赛
思路:因为每个国家的最后一个字母都不相同,所以可以通过最后一个字母来映射一个国家(map就可以了)
代码
#include <bits/stdc++.h>
using namespace std;
unordered_map<char, string> mp;
int n;
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
mp['o'] = "FILIPINO";
mp['u'] = "JAPANESE";
mp['a'] = "KOREAN";
while(n --)
{
string s;
cin >> s;
cout << mp[s[s.size() - 1]] << endl;
}
return 0;
}
思路:题目的要求:子数组的前一半元素和后一半元素的异或和相等,而两个相同的数异或和为0,所以我们只需要找到异或和为0并且数组长度为偶数的子数组个数,这里可以用前缀异或。只要找到两个前缀异或和相等的下标并且同为奇数或者偶数就表示存在一个。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 300010;
int a[N];
int n;
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
unordered_map<int, int> mp[2];
LL ans = 0;
int sum = 0;
mp[0][0] ++;
for(int i = 1; i <= n; i ++)
{
sum ^= a[i];
ans += mp[i & 1][sum];
mp[i & 1][sum] ++;
}
cout << ans << endl;
return 0;
}
力扣第306场周赛
第一题:2373. 矩阵中的局部最大值 - 力扣(LeetCode)
思路:模拟找最大值。
代码
class Solution {
public:
vector<vector<int>> largestLocal(vector<vector<int>>& grid) {
vector<vector<int>> ans;
vector<int> res;
int n = grid.size();
for(int i = 1; i < n - 1; i ++)
{
res.resize(0);
for(int j = 1; j < n - 1; j ++)
{
int t = 0;
for(int k = -1; k <= 1; k ++)
{
for(int l = -1; l <= 1; l ++)
t = max(t, grid[i + k][j + l]);
}
res.push_back(t);
}
ans.push_back(res);
}
return ans;
}
};
第二题:Loading Question... - 力扣(LeetCode)
思路:我一看到题目还以为是一个图,后来仔细看了一下不需要用邻接表来存储。因为只计算指向一个点的积分和,所以可以直接用数组来存储每个节点的积分和,循环数组来计算积分和就可以了。
代码
class Solution {
public:
int edgeScore(vector<int>& edges) {
int n = edges.size();
vector<long long> ans(n);
for(int i = 0; i < n; i ++)
ans[edges[i]] += i;
long long m = -1;
int res;
for(int i = 0; i < n; i ++)
{
if(m < ans[i])
{
m = ans[i];
res = i;
}
}
return res;
}
};
第三题:2375. 根据模式串构造最小数字 - 力扣(LeetCode)
思路:这题的思路和全排列的思路不能说很像,只能说一模一样(只是处理的位置有点不同)。
用dfs对每个位置进行0~9进行枚举,用在满足pattern数组的情况下找到字典序最小的字符串(通过全局变量)。
代码
class Solution {
public:
int d[10];
int n;
string ans, res;
void dfs(int u, string p)
{
if(u == n + 1)
{
ans = min(ans, res);
return;
}
for(int i = 1; i <= 9; i ++)
{
if(!d[i])
{
if(p[u - 1] == 'I' && i + '0' > res[u - 1])
{
d[i] ++;
res[u] = i + '0';
dfs(u + 1, p);
d[i] --;
}
else if(p[u - 1] == 'D' && i + '0' < res[u - 1])
{
d[i] ++;
res[u] = i + '0';
dfs(u + 1, p);
d[i] --;
}
}
}
}
string smallestNumber(string p) {
n = p.size();
res.resize(n + 1);
ans = "987654321";
for(int i = 1; i <= 9; i ++)
{
res[0] = i + '0';
d[i] ++;
dfs(1, p);
d[i] --;
}
return ans;
}
};