这个题目明确说了不涉及大数,假设第i个为b[i]:

b[0]=s1;

b[1]=s2;

b[3]=s1+s2;

b[4]=s1+2*s2;

b[5]=2*s1+3*s2;

b[6]=3*s1+5*s2;

b[7]=5*s1+8*s2;

………………

于是s1和s2的系数从某一项开始分别成斐波那契数列,于是只要算出b[k]中有多少个s1和多少个s2即可解决问题

#include<iostream>
#include<string>
using namespace std;
int main()
{
int i,j,p,c,k,T;
cin>>T;
string s1,s2;
while(T--){
cin>>s1>>s2>>k;
int a[51];
int b[26],c[26];
a[0]=1,a[1]=1;  //初始化斐波那契数列
for(i=0;i<26;i++)
c[i]=b[i]=0;       //每一项都设置为0
for(i=2;i<k;i++)
a[i]=a[i-1]+a[i-2];
for(i=0;i<s1.size();i++)
b[s1[i]-'a']++;      
for(i=0;i<s2.size();i++)
c[s2[i]-'a']++;
if(k==0)
{
for(char ch='a';ch<='z';ch++)
cout<<ch<<":"<<b[ch-'a']<<endl;
cout<<endl;
continue;
}
if(k==1)
{
for(char ch='a';ch<='z';ch++)
cout<<ch<<":"<<c[ch-'a']<<endl;
cout<<endl;
continue;
}
for(i=0;i<26;i++)
{
b[i]=b[i]*a[k-2];    //注意对应关系
c[i]=c[i]*a[k-1];
c[i]=c[i]+b[i];
}
for(char ch='a';ch<='z';ch++)
cout<<ch<<":"<<c[ch-'a']<<endl;
cout<<endl;
}
return 0;
}

如果涉及大数,将上述代码做一个改进·也可以做出来,下面还有一个涉及大数的版本

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
typedef vector<vector<int>>vt;
class letter   //将每一个字母看为对象
{
public:
vt v;           //二维向量来储存大数
letter(){ vt v1(51); v = v1;};
char ch;
};
int main()
{
int T,i,k,j,t,p,c;
cin >> T;
string s1, s2;
while (T--)
{
cin >> s1 >> s2 >> k;
letter L[26];          //定义a-z 26个对象
for (i = 0; i < 26; i++)
{
L[i].ch = 'a' + i;
L[i].v[0].push_back(0);   
L[i].v[1].push_back(0); //初始化前两项
}
for (i = 0; i < s1.size(); i++)
L[s1[i] - 'a'].v[0][0]++;
for (i = 0;i<s2.size();i++)
L[s2[i] - 'a'].v[1][0]++;
for (i = 0; i < 26;i++)
for (j =2; j <=k;j++)
{
c = 0;
if (L[i].v[j - 1].size()>L[i].v[j - 2].size())
L[i].v[j - 2].insert(L[i].v[j - 2].begin(),0);
for (t = L[i].v[j - 2].size() - 1; t >= 0; t--)
{
p = L[i].v[j - 1][t] + L[i].v[j - 2][t] + c;
L[i].v[j].push_back(p % 10);
c = p / 10;
}
if (c>0)
L[i].v[j].push_back(c);
reverse(L[i].v[j].begin(), L[i].v[j].end());
}

//-----------------------------------以上实现大数相加

for (i = 0; i < 26; i++)
{
cout << L[i].ch << ":";
for (j = 0; j < L[i].v[k].size(); j++)
cout << L[i].v[k][j];
cout << endl;
}
cout << endl;
}           //控制输出
return 0;
}

hdu1708(C++)的更多相关文章

  1. OJ题目分类

    POJ题目分类 | POJ题目分类 | HDU题目分类 | ZOJ题目分类 | SOJ题目分类 | HOJ题目分类 | FOJ题目分类 | 模拟题: POJ1006 POJ1008 POJ1013 P ...

随机推荐

  1. IOS笔记044-通知和代理(观察者模式和代理模式)

      处理文本输入框的输入事件,单击文本输入框后要弹出键盘. 弹出键盘有两种实现方式:一种代理,一种通知.也就是对应的(观察者模式和代理模式).   1.通知 1.1.准备工作 每一个应用程序都有一个通 ...

  2. bugku 普通的二维码

    记录下对进制转换实现的重新思考. 扫描二维码扫到了一句垃圾话. 拖到winhex里面. 一开始以为是十进制直接转ascii,发现错误. 后来发现,最大数是7,八进制转换吧. 我是打算用python的l ...

  3. vue-devtools安装

    https://www.cnblogs.com/yuqing6/p/7440549.html

  4. Python 拓展之迭代器

    写在之前 今天来讲讲「迭代器」的内容,其实已经拖了好多天了,感觉再不写就要忘记了.「迭代」相信对你来说已经不陌生了,我前面曾经专门用一篇文章来讲,如果你已经没有什么印象的话,就再点进去看看(零基础学习 ...

  5. js跨域post请求

    function funPostBack(srvMethod){ /* var contentNR=$(document.getElementById("reportFrame") ...

  6. redis 集群添加新节点

    准备好需要添加的节点:如何创建节点 启动创建的节点: 启动成功: 添加新节点:redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000  第 ...

  7. asp.net允许跨域访问

    C# ASP.NET MVC 配置允许跨域访问 在web.config文件中的 system.webServer 节点下 增加如下配置 <httpProtocol> <customH ...

  8. 【WC2019笔记】IOI2018 / ACM题目选讲

    哇!济南的 rqy 大佬讲课!就是 $luogu$ 上有名的那位! 上面这句话写错了,请大家无视 XylophoneIOI2018 练习赛 T2题意:交互提有一个 $0\sim n-1$ 的排列,保证 ...

  9. mac 常用操作

    1. 快速获取文件夹的位置: 打开文本 terminal 程序,将文件拖进去,路径会自己主动打印出来 2. 移动文件夹: 选中目标文件,然后使用 Command+C 复制,然后用 Command +O ...

  10. 很好用的取代 PuTTY 的SSH远程登陆软件 Termius

    一直以来, 我都是用 PuTTY 一个窗口一个窗口来监视我所有的远程服务器. putty-connections-on-a-screen 总感觉非常的不方便, 特别是当远程链接断开需要再重新打开PUT ...