Codeforces Round #659 (Div. 2) C. String Transformation 1(字符串,思维)

题目链接

题意:

给你两个长度相同的字符串a,b。你每次可以选择a中一些有相同字符的位置,把这些字符改成另一个大于他的字符。问至少要经过多少次修改,才能使a变成b。

思路:

我们只需要找a中与b不同的字母是否小于b中的字母并且记录是哪一个字母即可。

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=1e5+7;
const int M=4e5+8;
const double eps=1e-8;
const int mod=1e9+7;
const int inf=0x7fffffff;
const double pi=3.1415926;
signed main()
{
    IOS;
    int t;
	cin>>t;
	while(t--)
    {
		int n,m=10086;
		cin>>n;
		string a,b;
		set<int>e[30];
		cin>>a>>b;
		int ok=0;
		for(int i=0;i<n;i++)
		{
			if(b[i]>a[i])
			{
			    e[a[i]-'a'].insert(b[i]-'a');
			}
			if(a[i]>b[i])
			{
			    ok=1;
			}
		}
		if(ok)
        {
			cout<<-1<<endl;
			continue;
		}
		int ans=0;
		for(int i=0;i<26;i++)
        {
			int now;
			if(e[i].size())
			{
				ans++;
				now=*e[i].begin();
				e[i].erase(e[i].begin());
				for(auto x:e[i])
				{
				    e[now].insert(x);
				}
			}
 
		}
		cout<<ans<<endl;
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ACkingdom/article/details/107602665