Codeforces Round #506 (Div. 3)未完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #506 (Div. 3)未完结相关的知识,希望对你有一定的参考价值。

2022.3.8
题单地址:https://codeforces.com/contest/1029

目录

A. Many Equal Substrings


就是找最长的前缀和后缀

#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
string s;
int main(void)

    cin>>n>>k>>s;
    for(int i=1;i<s.size();i++) 
    
        string temp1=s.substr(i);
        string temp2=s.substr(0,temp1.size());
        if(temp1==temp2) 
        
            ans=temp1.size();
            break;
        
    
    string temp=s.substr(ans);
    for(int i=0;i<k-1;i++) s+=temp;
    cout<<s;
    return 0;

B. Creating the Contest【贪心】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*4+10;
typedef long long int LL;
LL a[N],n,cnt,ans=1;
int main(void)

    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    cnt=1;
    for(int i=1;i<n;i++)
    
        if(a[i]<=a[i-1]*2) cnt++;
        else cnt=1;
        ans=max(ans,cnt);
    
    cout<<ans;
    return 0;

C. Maximal Intersection【multiset 的用法】


详细题解

你会发现如果是俄罗斯套娃这样的,你会发现公共部分就是最小的右端点-最大的左端点
如果不是上述情况,那么说明是有好几堆,此时的最小的右端点-最大的左端点是一个负数,无解。

#include<bits/stdc++.h>
using namespace std;
multiset<int>l,r;
vector<pair<int,int>>ve;
int n;
int main(void)

    cin>>n;
    for(int i=0;i<n;i++)
    
        int a,b; cin>>a>>b;
        ve.push_back(a,b);
        l.insert(a);
        r.insert(b);
    
    int ans=0;
    for(int i=0;i<n;i++)
    
        int x=ve[i].first,y=ve[i].second;
        l.erase(l.find(x)),r.erase(r.find(y));
        int r1=*r.begin(),l1=*l.rbegin();
        int len=max(0,r1-l1);
        ans=max(ans,len);
        l.insert(x),r.insert(y);
    
    cout<<ans;
    return 0;

D. Concatenated Multiples【离线预处理】


#include<bits/stdc++.h>
using namespace std;
typedef  long long int LL;
const int N=1e5*2+10;
map<pair<int,int>,int>mp;
LL n,k,a[N];
LL f[15]=
0,10,100,1000,10000,100000,1000000,10000000,
100000000,1000000000,10000000000;
LL get(LL x)

    int cnt=0;
    while(x) x/=10,cnt++;
    return cnt;


int main(void)

    scanf("%llu%llu",&n,&k);
    for(int i=0;i<n;i++) 
    
        scanf("%llu",&a[i]);
        for(LL j=1;j<=10;j++)//预处理
        
            LL temp=(a[i]%k)*(f[j]%k);
            temp=temp%k;
            mp[j,temp]++;
        
    

    LL ans=0;
    for(int i=0;i<n;i++)
    
        LL temp=(k-(a[i]%k))%k;
        LL len=get(a[i]);
        if(mp.count(len,temp)) ans+=mp[len,temp];
        temp=a[i]%k*f[len]+a[i];
        if(temp%k==0) ans--;//减去自身
    
    cout<<ans;
    return 0;

以上是关于Codeforces Round #506 (Div. 3)未完结的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #506 (Div. 3)

Codeforces Round #506 (Div. 3) C. Maximal Intersection

Codeforces Round #506 (Div. 3) C. Maximal Intersection (枚举)

Codeforces Round #506 (Div. 3) D. Concatenated Multiples

Codeforces Round #506 (Div. 3) D-F

Codeforces Round #506 D. Concatenated Multiples题解