zoukankan      html  css  js  c++  java
  • Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 构造

    F. Equalizing Two Strings

    You are given two strings s and t both of length n and both consisting of lowercase Latin letters.

    In one move, you can choose any length len from 1 to n and perform the following operation:

    Choose any contiguous substring of the string s of length len and reverse it;
    at the same time choose any contiguous substring of the string t of length len and reverse it as well.
    Note that during one move you reverse exactly one substring of the string s and exactly one substring of the string t.

    Also note that borders of substrings you reverse in s and in t can be different, the only restriction is that you reverse the substrings of equal length. For example, if len=3 and n=5, you can reverse s[1…3] and t[3…5], s[2…4] and t[2…4], but not s[1…3] and t[1…2].

    Your task is to say if it is possible to make strings s and t equal after some (possibly, empty) sequence of moves.

    You have to answer q independent test cases.

    Input

    The first line of the input contains one integer q (1≤q≤104) — the number of test cases. Then q test cases follow.

    The first line of the test case contains one integer n (1≤n≤2⋅105) — the length of s and t.

    The second line of the test case contains one string s consisting of n lowercase Latin letters.

    The third line of the test case contains one string t consisting of n lowercase Latin letters.

    It is guaranteed that the sum of n over all test cases does not exceed 2⋅105 (∑n≤2⋅105).

    Output

    For each test case, print the answer on it — "YES" (without quotes) if it is possible to make strings s and t equal after some (possibly, empty) sequence of moves and "NO" otherwise.

    Example

    input
    4
    4
    abcd
    abdc
    5
    ababa
    baaba
    4
    asdf
    asdg
    4
    abcd
    badc
    output
    NO
    YES
    NO
    YES

    题意

    现在给你两个字符串,你可以进行若干次操作。

    每次操作需要在每个字符串都选择出长度为len的一个区间,然后将这个区间的字符都进行翻转。

    问你进行若干次操作后,这俩字符串能变成一样的吗?

    题解

    按照这个顺序进行判断:

    1. 如果两个字符串存在不同的字符,那么肯定是NO
    2. 如果某个字符串存在两个相同的字符,那么一定是YES,因为可以就在这两个字符中进行无限次的翻转
    3. 如果两个字符串的逆的奇偶性相同,那么一定是YES

    第三个怎么理解呢?在判断1和2之后,我们得到的一定是一个排列,问题就变成你可以翻转若干次,两个排列能否相同。

    我们考虑我们同时翻转相同长度的,我们排列的逆一定会发生奇偶性的变化,那么如果一开始奇偶性就不同,那么不管怎么翻转,都不会相同。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    int n;
    string s1,s2,S1,S2;
    int Count(string s){
    	int num=0;
    	for(int i=0;i<s.size();i++){
    		for(int j=0;j<i;j++){
    			if(s[j]>s[i])
    				num++;
    		}
    	}
    	return num;
    }
    void solve(){
    	cin>>n>>S1>>S2;
    	s1=S1;s2=S2;
    	sort(s1.begin(),s1.end());
    	sort(s2.begin(),s2.end());
    	for(int i=0;i<n;i++){
    		if(s1[i]!=s2[i]){
    			puts("NO");
    			return;
    		}
    	}
    	for(int i=1;i<n;i++){
    		if(s1[i]==s1[i-1]){
    			puts("YES");
    			return;
    		}
    		if(s2[i]==s2[i-1]){
    			puts("YES");
    			return;
    		}
    	}
    
    	if(Count(S1)%2==Count(S2)%2){
    		puts("YES");
    	}else{
    		puts("NO");
    	}
    	return;
    }
    int main(){
    	int t;
    	scanf("%d",&t);
    	while(t--)solve();
    }
  • 相关阅读:
    windwos8.1英文版安装SQL2008 R2中断停止的解决方案
    indwows8.1 英文版64位安装数据库时出现The ENU localization is not supported by this SQL Server media
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    SQL数据附加问题
    eclipse,myeclipse中集合svn的方法
    JAVA SSH 框架介绍
    SSH框架-相关知识点
    SuperMapRealSpace Heading Tilt Roll的理解
    SuperMap iserver manage不能访问本地目的(IE9)
    Myeclipse中js文件中的乱码处理
  • 原文地址:https://www.cnblogs.com/qscqesze/p/11799050.html
Copyright © 2011-2022 走看看