地址: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]);
}
}