3 条题解

  • 1
    @ 2023-10-15 11:58:41
    /*****************************************
    备注:
    ******************************************/
    #include <queue>
    #include <math.h>
    #include <stack>
    #include <stdio.h>
    #include <iostream>
    #include <vector>
    #include <iomanip>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define LL long long
    const int N = 2e3 + 10;
    const int INF = 0x3f3f3f3f;
    
    int t , n , k;
    string a[N];
    
    int num1[30];//第一串字母出现次数
    int num2[30];//其他串字母出现次数
    int sum[N];//差异值
    
    int main()
    {
    	cin >> t;
    	while( t-- )
    	{
    		cin >> k >> n;
    		for(int i = 0; i < k ; i++)
    			cin >> a[i];
    
    		//求第一组数据每个字母出现的次数
    		if( k == 1)
    		{
    			printf("YES\n");
    			continue;
    		}
    
    		bool flag = 0 , flag1 = 0;
    		memset(num1, 0 , sizeof(num1));
    		memset(num2, 0 , sizeof(num2));
    		memset(sum, 0 , sizeof(sum));
    
    		for(int i = 1; i < k; i++)//枚举2~k-1组数据
    		{
    			for(int j = 0; j < n; j++)
    			{
    				num1[a[0][j] - 'a']++;//第一组数据每个字母出现次数
    				num2[a[i][j] - 'a']++;//其他组每个字母出现次数
    				if(a[0][j] != a[i][j])//第i组数据与第一组数据的差异值
    					sum[i]++;
    			}
    
    			//判断每个字母出现次数是否相同
    			for(int i = 0; i < 26; i++)
    				if(num1[i] != num2[i])
    				{
    					flag = 1;
    					break;
    				}
    			//有一串出现次数与第一串不一祥
    			if(flag)
    			{
    				break;
    			}
    		}
    		if(flag)
    		{
    			printf("NO\n");
    			continue;
    		}
    
    		//标记是否有相同字母
    		for(int i = 0 ; i < 26; i++)
    			if(num1[i])
    			{
    				flag1 = 1;
    				break;
    			}
    
    		int anssum = 0;
    		bool flag2 = 0;
    		for(int i = 0 ; i < n; i++)//枚举每一个字符
    		{
    			for(int j = i + 1; j < n; j++)//枚举待交换字符
    			{
    				anssum = 0;
    				for(int l = 1; l < k; l++)//枚举除第一串外的字符串
    				{
    					int cnt = sum[l];//第l串字符与第一串字符的差异数
    					//交换字符ij后对第l串的影响
    					if(a[0][i] != a[l][i]) cnt--;
    					if(a[0][j] != a[l][j]) cnt--;
    					if(a[0][i] != a[l][j]) cnt++;
    					if(a[0][j] != a[l][i]) cnt++;
    
    					if((cnt == 0 && flag1) || cnt == 2)
    						anssum++;
    					else
    						break;
    				}
    
    				if(anssum == k - 1)
    				{
    					printf("YES\n");
    					flag2 = 1;
    					break;
    				}
    			}
    			if(flag2)
    				break;
    		}
    		if(!flag2)
    			printf("NO\n");
    
    
    	}
        return 0;
    }
    
    • 1
      @ 2023-10-15 11:55:04

      /***************************************** 备注: ******************************************/ #include <queue> #include <math.h> #include <stack> #include <stdio.h> #include <iostream> #include <vector> #include <iomanip> #include <string.h> #include <algorithm> using namespace std; #define LL long long const int N = 2e3 + 10; const int INF = 0x3f3f3f3f;

      int t , n , k; string a[N];

      int num1[30];//第一串字母出现次数 int num2[30];//其他串字母出现次数 int sum[N];//差异值

      int main() { cin >> t; while( t-- ) { cin >> k >> n; for(int i = 0; i < k ; i++) cin >> a[i];

      //求第一组数据每个字母出现的次数
      	if( k == 1)
      	{
      		printf("YES\n");
      		continue;
      	}
      
      	bool flag = 0 , flag1 = 0;
      	memset(num1, 0 , sizeof(num1));
      	memset(num2, 0 , sizeof(num2));
      	memset(sum, 0 , sizeof(sum));
      
      	for(int i = 1; i < k; i++)//枚举2~k-1组数据
      	{
      		for(int j = 0; j < n; j++)
      		{
      			num1[a[0][j] - 'a']++;//第一组数据每个字母出现次数
      			num2[a[i][j] - 'a']++;//其他组每个字母出现次数
      			if(a[0][j] != a[i][j])//第i组数据与第一组数据的差异值
      				sum[i]++;
      		}
      
      		//判断每个字母出现次数是否相同
      		for(int i = 0; i < 26; i++)
      			if(num1[i] != num2[i])
      			{
      				flag = 1;
      				break;
      			}
      		//有一串出现次数与第一串不一祥
      		if(flag)
      		{
      			break;
      		}
      	}
      	if(flag)
      	{
      		printf("NO\n");
      		continue;
      	}
      
      	//标记是否有相同字母
      	for(int i = 0 ; i < 26; i++)
      		if(num1[i])
      		{
      			flag1 = 1;
      			break;
      		}
      
      	int anssum = 0;
      	bool flag2 = 0;
      	for(int i = 0 ; i < n; i++)//枚举每一个字符
      	{
      		for(int j = i + 1; j < n; j++)//枚举待交换字符
      		{
      			anssum = 0;
      			for(int l = 1; l < k; l++)//枚举除第一串外的字符串
      			{
      				int cnt = sum[l];//第l串字符与第一串字符的差异数
      				//交换字符ij后对第l串的影响
      				if(a[0][i] != a[l][i]) cnt--;
      				if(a[0][j] != a[l][j]) cnt--;
      				if(a[0][i] != a[l][j]) cnt++;
      				if(a[0][j] != a[l][i]) cnt++;
      
      				if((cnt == 0 && flag1) || cnt == 2)
      					anssum++;
      				else
      					break;
      			}
      
      			if(anssum == k - 1)
      			{
      				printf("YES\n");
      				flag2 = 1;
      				break;
      			}
      		}
      		if(flag2)
      			break;
      	}
      	if(!flag2)
      		printf("NO\n");
      
      
      }
      return 0;
      

      }

      • 0
        @ 2023-12-13 12:11:46
        #include<bits/stdc++.h>
        using namespace std;
        const int N=2e3+5;
        string s;
        long long cnt[30],cnt2[30];
        int main()
        {
        	ios::sync_with_stdio(false);
        	cin.tie(0);
        	long long T;
        	cin>>T;
        	while(T--)
        	{
        		long long n,len;
        		cin>>n>>len;
        		memset(cnt,0,sizeof(cnt));
        		cin>>s;
        		for(long long i=0;i<len;i++)
        		{
        			cnt[s[i]-97]++;
        		}
        		bool b1=true;
        		for(long long i=2;i<=n;i++)
        		{
        			string p=s;
        			cin>>s;
        			long long cnt3=0; 
        			if(b1==true)
        			{
        				for(long long j=0;j<len;j++)
        				{
        					if(s[j]!=p[j])
        					{
        						cnt3++;
        					}
        					if(cnt3>4)
        					{
        						b1=false;
        						break;
        					}
        				}
        			}
        			memset(cnt2,0,sizeof(cnt));
        			for(long long j=0;j<len;j++)
        			{
        				cnt2[s[j]-97]++;
        			}
        			for(long long j=0;j<26;j++)
        			{
        				if(cnt2[j]!=cnt[j])
        				{
        					b1=false;
        				}
        			}
        		}
        		if(b1==false)
        		{
        			cout<<"NO\n";
        		}else
        		{
        			cout<<"YES\n";
        		}
        	}
        }
        
        • 1

        信息

        ID
        2306
        时间
        1000ms
        内存
        256MiB
        难度
        9
        标签
        递交数
        161
        已通过
        18
        上传者