2021牛客寒假算法基础集训营3 H.数字串 (贪心&构造)

H.数字串

题目链接:https://ac.nowcoder.com/acm/contest/9983/H

题目描述:

牛牛发现了一种方法可以将只包含小写字母的字符串按照以下方式使其转换成一个数字串:
取其中的每个字母,a转换为1,b转换为2…z转换为26,然后将这些数字拼接起来。
例如,abcz可以转换为12326。
现在给出一个只包含小写字母的字符串S,你需要找到一个只包含小写字母的字符串T,使得两个串不相同但是能转换成相同的数字串。

输入描述:

一行一个长度不超过10^6的小写字母字符串S。

输出描述:

一行一个长度不超过2×10^6 的小写字母字符串T。
如果无解,请输出-1。
如果答案有解且你输出的字符串包含了除了小写字母以外的字符或长度超过了2×10^6,那么你会得到“答案错误”的返回结果。
否则如果答案有解且你的答案与输入的字符串可以转换为一样的数字串,那么你的答案会被认为是正确的。

示例1:

输入
cwc
输出
cbcc
说明
cwc和cbcc转换成的数字串都是3233

示例2:

输入
ccc
输出
-1

解题思路:

考虑一个字符能否拆分,以及相邻两个字符能否合并,否则无解输出-1。
将给定的字母串转化为数字串,①优先使用两位数,②优先使用个位数(字符一一对应转换)如果两种方案构造出的字母串相等,则无解输出-1。否则输出和初始串不等的任意字符串。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std;
typedef long long ll;
int main(){
    
    
	string s;
	ll i;
	cin>>s;
	string x="",y="";
	ll len=s.length();
	for(i=0;i<len;i++){
    
    
		ll t=s[i]-'a'+1;
		if(t/10>0 && t%10!=0){
    
    
			x += t/10+'a'-1;
			x += t%10+'a'-1;
		}
		else x += s[i];
	}
	if(x != s){
    
    
		cout<<x;  
		return 0;	
	}
	for(i=0;i<len-1;i++){
    
    
		ll x1=s[i]-'a'+1;
		ll x2=s[i+1]-'a'+1;
		ll cnt=x1*10+x2;
		if(x2<10&&cnt<=26){
    
    
			y += cnt+'a'-1;  i++;
		}else
			y+=s[i];
	}
	if(i==len-1)
		y+=s[i];
	if(y != s)
		cout<<y;
	else
		cout<<"-1";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45894701/article/details/113729908