其他分享
首页 > 其他分享> > acwing第65场周赛

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