http://acm.hdu.edu.cn/showproblem.php?pid=1708
Fibonacci String
Time Limit: 3000/1000 MS (Java/Others)Total Submission(s): 1556
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
Recommend
lcy
分析:这个题,我刚刚看还真觉得麻烦,因为有26个字母,难道要int26个?最后看了网上的解题报告才知道,原来字符就是ASCII码,通过ASCII码用类似哈希打表的方式保存即可,再加上斐波那契数列递推就可以了。
代码如下:
#include<stdio.h>
#include<string.h>
int ans[50][27];
//开空间要足够大,在这地方wrong了次.50 27应该是允许的最小值了
int main()
{
int T,n,i,j;
char s1[31],s2[31];
scanf("%d",&T);
while(T--)
{
scanf("%s%s%d",s1,s2,&n);
memset(ans,0,sizeof(ans));
for(i=0;s1[i]!=NULL;i++)
ans[0][s1[i]-'a']++;
for(i=0;s2[i]!=NULL;i++)
ans[1][s2[i]-'a']++;
for(i=2;i<=n;i++)
for(j=0;j<26;j++)
ans[i][j]=ans[i-1][j]+ans[i-2][j];
for(i=0;i<26;i++)
printf("%c:%d\n",'a'+i,ans[n][i]);
printf("\n"); //Please output a blank line after each test case.又wrong了次。。。
}
return 0;
}
#include<string.h>
int ans[50][27];
int main()
{
}