2024 ICPC 亚洲区域赛南京站

E. Left Shifting 3

statements

方法一

两个nanjing 子串不可能相交,因此只要左移之后,字符串的开头不会“截断”一个nanjing子串,就能得到最大的答案。nanjing 子串的长度是 7,所以左移 7 次之内肯定有个位置不会截断nanjing 子串。因此模拟min(k,7) 次左移并计算答案即可。

#include <bits/stdc++.h>
#define int long long
using namespace std;
int fnd(string s){
    int n=s.length();
    int res=0;
    for(int i=0;i+7-1<n;i++){
        if(s.substr(i,7)=="nanjing") res++;
    }
    return res;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--){
        int n,k;
        cin>>n>>k;
        string s;
        cin>>s;
        int ans=0;
        if(k<=6){
            string tmp=s;
            for(int i=0;i<=min(n,k);i++){
                tmp=s.substr(i,n)+s.substr(0,i);
                ans=max(ans,fnd(tmp));
            }
        }
        else{
            string tmp=s;
            for(int i=0;i<min((long long)7,n);i++){
                tmp=s.substr(i,n)+s.substr(0,i);
                ans=max(ans,fnd(tmp));
            }
        }
        cout<<ans<<'\n';
    }
    return 0;
}

方法二

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int f[N];
void solve(){
    int n,k;
    cin>>n>>k;
    for(int i=0;i<=2*n+10;i++) f[i]=0;
    string s;
    cin>>s;
    s+=s;
    k=min(k,n);
    for(int i=6;i<2*n;i++){
        if(s.substr(i-6,7)=="nanjing") f[i]++;
        f[i]+=f[i-1];
    }
    int ans=0;
    for(int i=0;i<=k;i++)
        ans=max(ans,f[max(0,i+n-1)]-f[i]);
    cout<<ans<<'\n';
}
signed main(){
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    int t;
    cin>>t;
    while(t--) solve();
    return 0;
}

J. Social Media

statements
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int cnt[N],t[N];
void solve(){
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=max(2,k);i++) cnt[i]=t[i]=0;
    unordered_set<int> st;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        st.insert(x);
    }
    map<pair<int,int>,int> s;
    int ans=0;
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        if(a>b) swap(a,b);
        s[{a,b}]++;
        if(st.count(a)&&st.count(b)) ans++;
        else if(st.count(a)) cnt[b]++;
        else if(st.count(b)) cnt[a]++;
        else if(a==b) cnt[a]++; 
    }
    for(int i=1;i<=k;i++) t[i]=cnt[i];
    int res=0;
    sort(t+1,t+k+1,greater<int>());
    res=t[1]+t[2];
    for(auto t:s){
        int a=t.first.first;
        int b=t.first.second;
        if(a==b) continue ;
        int tmp=0;
        if(st.count(a)==0&&st.count(b)==0){
            tmp=cnt[a]+cnt[b];
            res=max(res,tmp+t.second);
        }
    }
    cout<<ans+res<<'\n';
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--) solve();
    return 0;
}

B. Birthday Gift

statements

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容