• 题解 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
    ");oks =1;break;
    		}
    	}
    	
    	if(oks) continue;
    	
    	if(a[26] == b[26]) printf("Yes
    ");
    	else printf("No
    ");		
    		
    	}
    	
     
     }
    
  • 相关阅读:
    课时作业
    第八周学习进度
    第一次nabcd编写
    第七周学习进度
    第六天进度
    第五天进度
    第四天进度
    第一篇
    1.Windows 系统下安装 IntelliJ IDEA
    Java开发环境(含IDE)的搭建
  • 原文地址:https://www.cnblogs.com/-Iris-/p/14043095.html
Copyright © 2020-2023  润新知