“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]);
    }
}
原文地址:https://www.cnblogs.com/liyexin/p/12782572.html