acwing第65场周赛
作者:互联网
1.最大价值
原题链接:https://www.acwing.com/problem/content/4606/
思路
经典双指针
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int n;
cin >> n;
while(n --)
{
int slen;
string s;
cin >> slen >> s;
int ans = 0;
for(int i = 0; s[i]; i ++)
{
int j = i + 1;
int cnt = 0;
if(s[i] == 'A')
{
while(s[j ++] == 'P') cnt ++;
ans = max(ans,cnt);
}
}
cout << ans << endl;
}
return 0;
}
2.集合查询
原题链接:https://www.acwing.com/problem/content/4607/
视频讲解:https://www.acwing.com/video/4244/
思路
存数的时候,可以存他所对应的01串模板,比如92、2212就存010.
其实就是,求一个新的二进制串,把92枚举每一位,如果是奇数就把二进制串后面加个1,如果是偶数就把二进制串后面加个0.
枚举92每一位,可以把92转换成对应的模板二进制串,用十进制来存x = x*2 + str[i] % 2;
('0'对应的ascii码为48所以直接使用str[i]%2是奇数还时偶数,奇数结果就是1,偶数结果就是0)
查询操作也可以通过x = x*2 + str[i]%2
来将模板字符串转化成相对应的十进制数
用哈希表来存
如果插入一个数,就让哈希表中该数的数量+1
如果删除一个数,就让哈希表中该数的数量-1
如果查询一个数,就用哈希表直接查询符合条件的数的数量
注意
此题可以用cnt数组代替哈希表
x取值范围是\([0,10^{18})\)
s串的长度是\([1,18]\),所以数组的大小为\(1<<18\)
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1 << 18;
int n;
int cnt[N];
int main()
{
int n;
scanf("%d",&n);
while(n --)
{
char op[2],str[20];
scanf("%s%s",op,str); // 操作符用%s来读取不容易出错
int x = 0; // 对应的二进制数(使用十进制来保存)
for(int i = 0; str[i]; i ++)
{
x = x * 2 + str[i] % 2;
}
if(*op == '+') cnt[x] ++; // 字符来判断 op[0] == '+'
else if(*op == '-') cnt[x] --;
else printf("%d\n",cnt[x]);
}
return 0;
}
标签:周赛,cnt,92,int,65,哈希,include,acwing 来源: https://www.cnblogs.com/rdisheng/p/16608660.html