题解 CF1451C [String Equality]

思路

根据性质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\n");oks =1;break;
		}
	}
	
	if(oks) continue;
	
	if(a[26] == b[26]) printf("Yes\n");
	else printf("No\n");		
		
	}
	
 
 }
posted @ 2020-11-26 16:45  ·Iris  阅读(106)  评论(0编辑  收藏  举报