zoukankan      html  css  js  c++  java
  • Codeforces #685 div2

    CF div2 #685

    C. String Equality

    1
    6 2
    aabbde
    deeeee
    

    我的想法是直接排序然后模拟加

    但是像这一组就炸了

    问题在于它加的模拟是从当前最小的起步,这里没有办法保证是不是最小的,本来应该让d加到e,中间两个b一起的,但是这里就成了b单飞了。

    WA的代码

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define max(a,b) (a>b ? a:b)
    #define min(a,b) (a<b ? a:b)
    #define swap(a,b) (a^=b^=a^=b)
    #define maxn 2050000
    #define minn -105
    #define ll long long int
    #define ull unsigned long long int
    #define uint unsigned int
    inline int read()
    {
        int ans=0;
        char last=' ',ch=getchar();
        while(ch<'0'|ch>'9')last=ch,ch=getchar();
        while(ch>='0'&&ch<='9')ans=ans*10+ch-'0',ch=getchar();
        if(last=='-')ans=-ans;
        return ans;
    }
    string s;
    
    int n,k;
    int a[maxn],b[maxn];
    int c[maxn];
    void solve()
    {
        cin>>n>>k;
        cin>>s;
        for(int i=0;i<n;i++)a[i]=s[i]-'a';
        cin>>s;
        for(int i=0;i<n;i++)b[i]=s[i]-'a';
        sort(a,a+n);
        sort(b,b+n);
        bool ok=1;
        int cur=0;
        for(;cur<n-k+1;cur++)
        {
            //cout<<cur<<endl;
            if(a[cur]-b[cur]>0)
            {
                cout<<"No
    ";
                return;
            }
            if(a[cur]==b[cur])continue;
            int tmp=b[cur]-a[cur];
            for(int i=1;i<k;i++)
            {
                if(a[cur+i]!=a[cur])
                {
                    cout<<"No
    ";
                    //cout<<cur<<" "<<cur+i<<endl;
                    return;
                }
                a[cur+i]+=tmp;
            }
            a[cur]+=tmp;
        }
        for(;cur<n;cur++)
            if(a[cur]!=b[cur])ok=0;
        if(ok)cout<<"Yes
    ";
        else cout<<"No
    ";
    
    }
    int main()
    {
    
        int _t;
        _t=read();
        while(_t--)solve();
        return 0;
    }
    /*
    1
    10 2
    debaaaaaba
    beadeeeabe
    
    1
    6 2
    aabbde
    deeeee
    
    */
    
    

    AC的代码

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define max(a,b) (a>b ? a:b)
    #define min(a,b) (a<b ? a:b)
    #define swap(a,b) (a^=b^=a^=b)
    #define maxn 27
    #define minn -105
    #define ll long long int
    #define ull unsigned long long int
    #define uint unsigned int
    inline int read()
    {
        int ans=0;
        char last=' ',ch=getchar();
        while(ch<'0'|ch>'9')last=ch,ch=getchar();
        while(ch>='0'&&ch<='9')ans=ans*10+ch-'0',ch=getchar();
        if(last=='-')ans=-ans;
        return ans;
    }
    string s;
    
    int n,k;
    int a[maxn],b[maxn];
    int c[maxn];
    void solve()
    {
        cin>>n>>k;
        cin>>s;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=0;i<n;i++)a[s[i]-'a']++;
        cin>>s;
        for(int i=0;i<n;i++)b[s[i]-'a']++;
        for(int cur=0;cur<26;cur++)
        {
            if(a[cur]-b[cur]<0)
            {
                cout<<"No
    ";
                return;
            }
            if(a[cur]==b[cur])continue;
            a[cur]-=b[cur];
            if(a[cur]%k)
            {
                cout<<"No
    ";
                return;
            }
            a[cur+1]+=a[cur];
        }
        cout<<"Yes
    ";
    
    }
    int main()
    {
    
        int _t;
        _t=read();
        while(_t--)solve();
        return 0;
    }
    /*
    1
    10 2
    debaaaaaba
    beadeeeabe
    
    1
    6 2
    aabbde
    deeeee
    
    */
    
    
  • 相关阅读:
    关于git的文件内容冲突解决
    【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
    如何判断一个变量是不是指针
    类型识别
    C++中的异常处理(下)
    C++中的异常处理(中)
    C++中的异常处理(上)
    C语言异常处理
    用Zebra打造Linux下小型路由器
    Linux下PortSentry的配置
  • 原文地址:https://www.cnblogs.com/et3-tsy/p/14018237.html
Copyright © 2011-2022 走看看