题目描述
给出两个字符串 s,t,其中 s 只包含小写字母 a
。
可以进行任意多次操作,每次操作可以把 s 中的一个字符 a
替换成字符串 t。
问能得到多少种不同的字符串,若可以得到无限种字符串,则输出 -1
。
输入格式
第一行输入一个正整数 T,表示数据的组数。
接下来 2T 行,每组数据两行两个字符串 s,t。
输出格式
输出 T 行,表示这组数据的答案。
样例输入
5
aaaa
a
aa
abc
a
b
aaaa
fffff
样例输出
1
-1
2
16
数据范围
对 30% 的数据,满足 t=a。
对另外 30% 的数据,满足 t 中不含小写字母 a
。
对所有数据,满足 1≤T≤10^4,1≤|s|,|t|≤50。
解题思路
已知s字符串只包含小写字母a,则我们可以对字符串t中的小写字母a进行分类讨论。
(1).字符串t中不含a,则只和字符串s中的a有关,我们可以把字符串t看成字母t,则
字符串s中的a的个数 | 不同字符串的个数 |
---|---|
1 | 2 |
2 | 4 |
3 | 8 |
4 | 16 |
5 | 32 |
简单举一个例子,当a的个数为4时,字符串的可能有:aaaa(一个都不变),taaa,ataa,aata,aaat(只变一个),ttaa,tata,taat,atta,atat,aatt(只变两个),ttta,ttat,tatt,attt(变三个),tttt(全部都变)。
即C40+C41+C42+C43+C44=2^4(二项式定理)
故我们可以知道这种情况下,结果只和s中a的个数有关。
(2).字符串t有且仅有一个a,在这种情况下,无论s中有几个a,替换只后依旧不变。
(3).字符串t有大于一的a,则s中一个a换两个a,可以得到字符串是无数个
代码
#include<iostream>
using namespace std;
int main()
{
int T;
string a , b;
long long int sum;
cin >> T;
for(int i = 0;i < T ; i ++)
{
sum = 1;//代替pow函数
int aa , ba = 0;//aa表示字符串a中字符a的个数,ba表示字符串b中字符a的个数
cin >> a;
cin >> b;
aa = a.size();//a字符串中全是字符a
for(int j = 0 ; j < b.size() ; j ++) if(b[j] == 'a') ba ++;//读取字符串b中字符a的个数
if(ba == 0)//字符串b中没有a,结果为2^aa,pow函数会按照科学计数法输出,会导致样例不能过
{
while(aa > 0) sum *= 2,aa --;
cout << sum << endl;
}
else if(ba == 1 && b.size() == 1) //字符串b有且只有一个a
cout << "1" <<endl;
else cout<< "-1" <<endl;
}
return 0;
}
笔法稚嫩,写的不好请指出,欢迎评论。