CF1674C solution
Problem
给定字符串 \(a\) 和 \(b\),其中 \(a\) 有且仅有字符 a,我们可以用 \(b\) 替换 \(a\) 中若干个字符 a(包括替换上的 \(b\) 的字符也可以),问最终可能会有几种字符串 \(a\)?如有无数种,输出 -1。
link->https://codeforces.com/contest/1674/problem/C
Solution
很明显,如果 \(b\) 有字符 \(a\) 那么且长度为 \(1\),则无论将其替换 \(a\) 中的哪一个字符 a,总是会得到原字符串 \(a\),输出 \(1\) 即可。
如果 \(b\) 有字符 \(a\) 且长度大于 \(1\),则我们将 \(b\) 替换其中一个 a,然后,我们可以继续用 \(b\) 替换 \(b\) 本身中的那个字符 a……以此类推,我们可以得到无数种字符串 \(a\)。
如果 \(b\) 中没有字符 a,那么对于 \(a\) 中的每一个位置,我们都可以使用或不使用 \(b\) 去替换,通过乘法原理,答案很明显为 \(2^{|a|}\)。
Code
#include<bits/stdc++.h>
#define pd push_back
#define pb pop_back
#define mk make_pair
#define int long long
#define PII pair<int,int>
#define _for(a,b,c) for(int a=b;a<=c;a++)
#define _rep(a,b,c) for(int a=b;a>=c;a--)
#define _go(i,u) for(int i=head[u];i;i=Edge[i].nxt)
using namespace std;
namespace I {
template <typename T> void read(T& x) {
x=0; T f=1; char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch&15); ch=getchar(); }
x=x*f; return;
}
template <typename T,typename ...Arg> void read(T& x,Arg& ...arg) {
read(x); read(arg...);
}
}
namespace Math {
template <typename T> T power(T a,T b,T MOD) {
T ans=1; while(b) { if(b&1) ans=ans*a%MOD; a=a*a%MOD; b>>=1; } return ans%MOD;
}
template <typename T> T power(T a,T b) {
T ans=1; while(b) { if(b&1) ans=ans*a; a=a*a; b>>=1; } return ans;
}
template <typename T> T gcd(T a,T b) {
if(b) return gcd(b,a%b); return a;
}
template <typename T> T lcm(T a,T b) {
return a/gcd(a,b)*b;
}
template <typename T> T inv(T n,T p) {
return power(n,p-2);
}
const int Test[]={0,2,3,5,7,11,13,17,19,23,29};
template <typename T> bool is_prime(T n) {
if(n<2) return 0;
T t=n-1,k=0; while((t+1)&1) ++k,t>>=1;
_for(i,1,10) {
if(n==Test[i]) return 1;
T s=power(Test[i],t,n); T tmp=s;
_for(j,1,k) {
tmp=s*s%n; if(tmp==1&&s!=1&&s!=n-1) return 0; s=tmp;
}
if(s!=1) return 0;
}
return 1;
}
}
const int N=100;
char a[N],b[N];
int Find(char s[],int n,char c) {
int tot=0;
_for(i,1,n)
if(s[i]==c) ++tot;
return tot;
}
signed main() {
int T;
I::read(T);
while(T--) {
scanf("%s%s",a+1,b+1);
int n=strlen(a+1);
int m=strlen(b+1);
int cnta=Find(a,n,'a');
int cntb=Find(b,m,'a');
if(cntb)
puts(m==1? "1":"-1");
else
printf("%lld\n",Math::power(2ll,cnta));
}
return 1;
}

浙公网安备 33010602011771号