“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\n",ch,mpa[ch]); } for(int i=0;i<26;i++) { char ch=char(i+97); if(mpa[ch]!=0) printf("%c: %d\n",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\n",ch,mpb[ch]); } for(int i=0;i<26;i++) { char ch=char(i+97); if(mpb[ch]!=0) printf("%c: %d\n",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\n",ch,mpall2[ch]); } for(int i=0;i<26;i++) { char ch=char(i+97); if(mpall2[ch]!=0) printf("%c: %d\n",ch,mpall2[ch]); } }