思路
根据性质1,我们可以对序列进行交换,保证了序列可以组成我们任何想要的次序
分析性质二,相当于我们可以进行区间加法但只能对连续且相同的k个数进行,这保证了如果存在一段数(num)个,那么无论怎么修改,终究会使这段剩下的数(len),使得$num equiv len pmod{k} $
设目标区间该段数个数为(Len)
反过来想,如果(num equiv Len pmod{k}) ,那么是这个区间为(Yes)的必要条件
于是我们就可以根据上述结论写出这道题了
Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int p=1e6+5;
#define int long long
#define INF 1<<30
template<typename _T>
inline void read(_T &x)
{
x=0;char s=getchar();int f=1;
while(s<'0'||s>'9') {f=1;if(s=='-')f=-1;s=getchar();}
while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}
x*=f;
}
int a[29];
int b[29];
char c[p],ch[p];
signed main()
{
int T;
read(T);
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,k;
read(n);read(k);
scanf("%s",c+1);scanf("%s",ch+1);
for(int i=1;i<=n;i++)
{
a[c[i]-'a'+1]++;
b[ch[i]-'a'+1]++;
}
int oks=0;
for(int i=1,cnt;i<=25;i++)
{
if(a[i]%k == b[i]%k && a[i] >=b[i])
{
cnt = a[i]-b[i];//将多余的数都扔到下一段去
a[i+1] += cnt;
}
else
{
printf("No
");oks =1;break;
}
}
if(oks) continue;
if(a[26] == b[26]) printf("Yes
");
else printf("No
");
}
}