Acwing第 26 场周赛完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing第 26 场周赛完结相关的知识,希望对你有一定的参考价值。

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;

以上是关于Acwing第 26 场周赛完结的主要内容,如果未能解决你的问题,请参考以下文章

Acwing第 31 场周赛完结

Acwing第 36 场周赛完结

Acwing第 56 场周赛完结

Acwing第 32 场周赛完结

Acwing第 59 场周赛完结

Acwing第 35 场周赛完结