你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Acwing第 26 场周赛【完结】

2021/11/22 12:50:02

目录

  • 4076. 字符串权值【签到】
  • 4077. k显性字符【思维 贪心 / 二分】
  • 4078. 01串【DP】

4076. 字符串权值【签到】

在这里插入图片描述
https://www.acwing.com/problem/content/4079/

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    string s; cin>>s;
    int sum=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='A') sum+=1;
        else if(s[i]=='1') sum+=10;
        else sum+=s[i]-'0';
    }
    cout<<sum;
	return 0;
}

4077. k显性字符【思维 贪心 / 二分】

在这里插入图片描述
https://www.acwing.com/problem/content/4080/
二分做法:

#include<bits/stdc++.h>
using namespace std;
set<char>st;
string s;
bool check(int k)
{
    for(auto i=st.begin();i!=st.end();i++)//枚举显性字符
    {
       int cnt[30]={0};
       char temp=*i;
       bool flag=0;
       for(int j=0;j<s.size();j++)
       {
           if(j>=k)
           {
               int l=j-k;
               cnt[s[l]-'a']--;
           }
           cnt[s[j]-'a']++;
           if(j>=k-1&&!cnt[temp-'a']) flag=1;
       }
       if(!flag) return true;
    }
    return false;
}
int main(void)
{
    cin>>s;
    for(int i=0;i<s.size();i++) st.insert(s[i]);
    int l=1,r=s.size();
    while(l<r)
    {
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<endl;
	return 0;
}

贪心,对于每一个字符求其最大的间距,注意开头和结尾也得特别加。
最后在所有的结果中取一个min即可。

#include<bits/stdc++.h>
using namespace std;
int last[30],maxv[30],n;
string s;
int main(void)
{
    cin>>s;
    s="0"+s;//下标从1开始
    for(int i=1;i<s.size();i++)
    {
        int t=s[i]-'a';
        maxv[t]=max(maxv[t],i-last[t]);
        last[t]=i;
    }
    int n=s.size()-1;
    for(int i=0;i<26;i++) maxv[i]=max(maxv[i],n-last[i]+1);//结尾
    int ans=n;
    for(int i=0;i<26;i++) 
    {
        ans=min(ans,maxv[i]);
    }
    cout<<ans;
    return 0;
}

4078. 01串【DP】

在这里插入图片描述
https://www.acwing.com/problem/content/description/4081/
状态表示: f[i] 长度为i 的01串的优秀字符串数量
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
const int mod=1e9+7;
LL f[N],t,k;
int main(void)
{
    cin>>t>>k;
    for(int i=0;i<N;i++)
    {
        if(i<k) f[i]=1;
        else if(i>=k) f[i]=(f[i-1]+f[i-k])%mod;
    }
    for(int i=1;i<N;i++) f[i]=(f[i]+f[i-1])%mod;//前缀和
    while(t--)
    {
        int l,r; cin>>l>>r;
        cout<<(f[r]-f[l-1]+mod)%mod<<endl;
    }
    return 0;
}