URAL 2026 C - Dean and Schedule

 
/*PROBLEM C : DEAN AND SCHEDULE "UNSOLVED" */

#include "cstdio"
#include "cstring"
#include "cctype"
#include "algorithm"
using namespace std;
#define Inc(i, a, b) for(int i = a; i < b; i++)
#define Dec(i, a, b) for(int i = a; i > b; i--)
#define Mem(a) memset(a, 0, sizeof(a))
#define Pii pair<int, int> 
#define Cin scanf
#define Put printf
#define CIN(a) scanf("%d", &a)
#define CII(a, b) scanf("%d%d", &a, &b)
#define CIS(a) scanf("%s", a)
#define PUT(a) printf("%d\n", a) 
#define PII(a, b) printf("%d %d\n", a, b)
#define PUS(a) printf("%s\n", a)
#define ll long long
#define maxn 100005

char st[maxn];
int k, len;
int is[27];
void Update() {
	Inc(i, 0, len) if(st[i] == '?') st[i] = (i & 1 ? 'a' : 'z');
}
int main() {
	CIS(st), CIN(k);
	len = strlen(st);
	if(len < k) {
		PUT(-1); return 0;
	}
	Mem(is);
	bool flag = 1;
	int t0 = 0;
	int odd = 0, even = 0;
	Inc(i, 0, len) {
		if(st[i] == '?') {
			flag = 0, t0++;
			if(i & 1) even++;
			else odd++;
		}
		else is[st[i] - 'a'] = 1;
	}
	int t1 = 0;
	Inc(i, 0, 26) t1 += is[i];
	if(flag) {
		if(t1 >= k) PUS(st); 
		else PUT(-1); return 0;
	}
	if(t0 + t1 < k) {
		PUT(-1); return 0;
	}
	if(t1 >= k) {
		Update();
		PUS(st); return 0;
	}
	int al = 0, ar = 25;
	if(!is[0] && even) {
		Inc(i, 0, len) if((i & 1) && st[i] == '?') {
			is[0] = 1, even--;
			st[i] = 'a', t1++; break;
		}
	}
	if(!is[25] && odd) {
		Inc(i, 0, len) if((i % 2 == 0) && st[i] == '?') {
			is[25] = 1, odd--;
			st[i] = 'z', t1++; break;
		}
	}
	int so = 0, se = 1;
	while(t1 < k) {
		Inc(i, so, len) if((i % 2 == 0) && st[i] == '?') {
			so = i; break;
		}
		Inc(i, se, len) if((i & 1) && st[i] == '?') {
			se = i; break;
		}
		Inc(i, al, ar + 1) if(!is[i]) {
			al = i; break;
		}
		Dec(i, ar, al - 1) if(!is[i]) {
			ar = i; break;
		}
		if(odd == 0) {
			Inc(i, se, len) {
				if(st[i] == '?') {
					if(t1 < k) {
						st[i] = 'a' + al;
						is[al] = 1, t1++;
						Inc(i, al, ar + 1) if(!is[i]) { al = i; break;}
					} else st[i] = 'a';
				}
			} break;
		} else if(even == 0) {
			Inc(i, so, len) {
				if(st[i] == '?') {
					if(t1 < k) {
						st[i] = 'a' + ar;
						is[ar] = 1, t1++;
						Dec(i, ar, al - 1) if(!is[i]) { ar = i; break;} 
					} else st[i] = 'z';
				}
			} break;
		}
		
		if(25 - al < ar) {
			st[so] = 'a' + ar, odd--;
			is[ar] = 1, t1++;
		} else {
			st[se] = 'a' + al, even--;
			is[al] = 1, t1++;
		}
	}
	Update();
	PUS(st);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值