zkj大爷带我刷bzoj~这题应该有很多解
考虑sa的计算方式,然后贪心。
如果当前sa的下一位的rank大于下个sa的下一位的rank,那么下一位sa的字母应该比当前大,否则相同。
ZBY:“可以证明这是对的”
2333
#include <cstdio>
#include <cctype>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define maxn 500007
inline int rd() {
char c = getchar();
while (!isdigit(c)) c = getchar() ; int x = c - '0';
while (isdigit(c = getchar())) x = x * 10 + c - '0';
return x;
}
char s[maxn];
int sa[maxn] , rk[maxn] , n;
int main() {
n = rd();
rep(i , 1 , n) sa[i] = rd() , rk[sa[i]] = i;
char t = 'a';
s[sa[1]] = t;
rep(i , 2 , n) {
if (rk[sa[i - 1] + 1] > rk[sa[i] + 1])
t ++;
if (t > 'z') {
puts("-1");
return 0;
}
s[sa[i]] = t;
}
puts(s + 1);
return 0;
}