zoukankan      html  css  js  c++  java
  • “Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)F--Figure out the sequence(map)

    地址:https://ac.nowcoder.com/acm/contest/5523/F

         题意:给出s1串和s2串,按以下方式组合:

             1: s1

           2: s2

           3: s1+s2

           4: s2+s1+s2

           5: s1+s2+s2+s1+s2

           ..........

           对每次过程s1,s2串出现次数计数,用a[]和b[]分别记录,可以得出:a[i]+b[i]==b[i+1]   b[i]==a[i+1]。所以可以先对n以内的a[],b[]打个表,用mpa和mpb对字母出现次数统计,然后乘上对应的出现次数,用mpall进行收集起来,按字典序把出现次数>0的字母打出来就行了。注意一下细节,先打所有出现过的大写字母,然后是小写字母。n=1只打s1串,n=2只打s2串,这里需要特判一下。

    #include<iostream>
    #include<cstdio>
    #include<map>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int maxn=30;
    char s1[maxn],s2[maxn];
    int n;    
    int a[50];
    int b[50];
    void init()
    {
        a[1]=1;
        a[2]=1;
        b[1]=1;
        b[2]=1;
        a[3]=1,b[3]=1,a[4]=1,b[4]=2;
        int amd=b[4],bmd=a[4]+b[4];
        for(int i=5;i<=n;i++)
        {
            a[i]=amd;
            b[i]=bmd;
            amd=b[i];
            bmd=a[i]+b[i];
        }
    }
    int main()
    {
        cin>>s1;
        cin>>s2;
        cin>>n;
        init();
        int len1=strlen(s1),len2=strlen(s2);
        map<char,int>mpa;
        map<char,int>mpb;
        map<char,int>mpall2;
        for(int i=0;i<len1;i++)
        {
            mpa[s1[i]]++;
        }
        for(int i=0;i<len2;i++)
        {
            mpb[s2[i]]++;
        }
        if(n==1)
        {
                    for(int i=0;i<26;i++)
                    {
                        char ch=char(i+65);
                        if(mpa[ch]!=0)
                        printf("%c: %d
    ",ch,mpa[ch]);
                    }
                    for(int i=0;i<26;i++)
                    {
                        char ch=char(i+97);
                        if(mpa[ch]!=0)
                        printf("%c: %d
    ",ch,mpa[ch]);
                    }        
                    return 0;
        }
        if(n==2)
        {
                    for(int i=0;i<26;i++)
                    {
                        char ch=char(i+65);
                        if(mpb[ch]!=0)
                        printf("%c: %d
    ",ch,mpb[ch]);
                    }
                    for(int i=0;i<26;i++)
                    {
                        char ch=char(i+97);
                        if(mpb[ch]!=0)
                        printf("%c: %d
    ",ch,mpb[ch]);
                    }        
                    return 0;
        }    
        for(int i=0;i<26;i++)
        {
            char daxie=char(i+65);
            char xiaoxie=char(i+97);
            mpa[xiaoxie]=mpa[xiaoxie]*a[n];
            mpa[daxie]=mpa[daxie]*a[n];
            mpb[xiaoxie]*=b[n];
            mpb[daxie]*=b[n];
            mpall2[xiaoxie]+=mpa[xiaoxie]+mpb[xiaoxie];
            mpall2[daxie]+=mpa[daxie]+mpb[daxie];
        }
        for(int i=0;i<26;i++)
        {
            char ch=char(i+65);
            if(mpall2[ch]!=0)
            printf("%c: %d
    ",ch,mpall2[ch]);
        }
        for(int i=0;i<26;i++)
        {
            char ch=char(i+97);
            if(mpall2[ch]!=0)
            printf("%c: %d
    ",ch,mpall2[ch]);
        }
    }
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/liyexin/p/12782572.html
Copyright © 2011-2022 走看看