您的位置:首页 > 其它

URAL 2026 C - Dean and Schedule

2015-08-02 10:56 337 查看
 
/*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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: