Fibonacci String
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4641 Accepted Submission(s): 1566
Problem Description
After little Jim learned Fibonacci Number in the class , he was very interest in it.
Now he is thinking about a new thing -- Fibonacci String .
He defines : str[n] = str[n-1] + str[n-2] ( n > 1 )
He is so crazying that if someone gives him two strings str[0] and str[1], he will calculate the str[2],str[3],str[4] , str[5]....
For example :
If str[0] = "ab"; str[1] = "bc";
he will get the result , str[2]="abbc", str[3]="bcabbc" , str[4]="abbcbcabbc" …………;
As the string is too long ,Jim can't write down all the strings in paper. So he just want to know how many times each letter appears in Kth Fibonacci String . Can you help him ?
Now he is thinking about a new thing -- Fibonacci String .
He defines : str[n] = str[n-1] + str[n-2] ( n > 1 )
He is so crazying that if someone gives him two strings str[0] and str[1], he will calculate the str[2],str[3],str[4] , str[5]....
For example :
If str[0] = "ab"; str[1] = "bc";
he will get the result , str[2]="abbc", str[3]="bcabbc" , str[4]="abbcbcabbc" …………;
As the string is too long ,Jim can't write down all the strings in paper. So he just want to know how many times each letter appears in Kth Fibonacci String . Can you help him ?
Input
The first line contains a integer N which indicates the number of test cases.
Then N cases follow.
In each case,there are two strings str[0], str[1] and a integer K (0 <= K < 50) which are separated by a blank.
The string in the input will only contains less than 30 low-case letters.
Then N cases follow.
In each case,there are two strings str[0], str[1] and a integer K (0 <= K < 50) which are separated by a blank.
The string in the input will only contains less than 30 low-case letters.
Output
For each case,you should count how many times each letter appears in the Kth Fibonacci String and print out them in the format "X:N".
If you still have some questions, look the sample output carefully.
Please output a blank line after each test case.
To make the problem easier, you can assume the result will in the range of int.
If you still have some questions, look the sample output carefully.
Please output a blank line after each test case.
To make the problem easier, you can assume the result will in the range of int.
Sample Input
1 ab bc 3
Sample Output
a:1 b:3 c:2 d:0 e:0 f:0 g:0 h:0 i:0 j:0 k:0 l:0 m:0 n:0 o:0 p:0 q:0 r:0 s:0 t:0 u:0 v:0 w:0 x:0 y:0 z:0
Author
linle
Source
好坏好坏的一道题,不知道算不算水题,感觉这道题还挺好的。斐波那契字符串,就是说第0串字符为 ab,第1串为bc。那么依据斐波那契第二串字符为abbc,第三串为bcabbc由于第三串里边有1个a,三个b,两个c,别的没有了,所以输出了測试例子那样的.
要是依照斐波那契一个一个字符串的加。预计输入一个50。最后一个的字符串都不知道多长了。同一时候字符数组也开不了这么大,于是就開始分析。26个字母里边的每个字母也是按斐波那契规律增长的,比方说,a在第0个字符串里边是1次,第1个字符串里边是0次,第二个里边是1+0=1次,第三次就是1+0=1次,同理得到了例子输出的b:3;
所以依据原理,就能够写出简单的代码.
附ac代码:
#include<stdio.h> #include<string.h> char c[1000],s[1000]; int a[27][100];//储存第1~100次所求字符串里边的第1~26个字母的个数. int main() { int t,m,n,k,i,j; scanf("%d",&t); while(t--) { scanf("%s%s%d",c,s,&n); int len=strlen(c);//測长度 int lem=strlen(s); memset(a,0,sizeof(a));//清零a数组. for(j=0;j<len;j++) for(i=1;i<=26;i++) if(c[j]==i+'a'-1)//假设当前字符等于第i个字母 a[i][1]++;//则在a[i][1]++。 for(j=0;j<lem;j++) for(i=1;i<=26;i++) if(s[j]==i+'a'-1) a[i][2]++; //同理得到第二个字符串的 每个字母有多少个. for(i=1;i<=26;i++) for(j=3;j<=n+1;j++) a[i][j]=a[i][j-1]+a[i][j-2];//进行斐波那契相加. for(i=1;i<=26;i++) printf("%c:%d ",i+'a'-1,a[i][n+1]); printf(" ");//每一次例子后须要加一个换行。由于没看这个pe了一次. } return 0; }
附測试例子: