比赛 2026.1.3 评测结果 AAAAAAAAAA
题目名称 KMP 最终得分 100
用户昵称 梦那边的美好ME 运行时间 0.996 s
代码语言 C++ 内存使用 15.06 MiB
提交时间 2026-01-03 11:38:34
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll n;
ll b[1100000];
ll c[1100000];
char s[1100000];
bool vis[26];

int main(){
    freopen("kmpp.in","r",stdin);
    freopen("kmpp.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for (int i=0;i<n;i++){
        cin>>b[i];
    }
    if (b[0] != 0){
        cout<<"Impossible"<<endl;
        return 0;
    }
    for (int i=0;i<n;i++){
        if (b[i]<0||b[i]>i){
            cout<<"Impossible"<<endl;
            return 0;
        }
        if (i>0&&b[i]>b[i-1]+1){
            cout<<"Impossible"<<endl;
            return 0;
        }
    }
    for (int i=0;i<n;i++) s[i]='a';
    for (int i=0;i<n;i++){
        if (b[i]>0){
            s[i]=s[b[i]-1];
        }else{
            for (int j=0;j<26;j++) vis[j]=0;
            if (i>0){
                int k=b[i-1];
                while (k>0){
                    vis[s[k]-'a']=1;
                    k=b[k-1];
                }
                vis[s[0]-'a']=1;
            }
            for (char c='a';c <= 'z';c++){
                if (!vis[c-'a']){
                    s[i]=c;
                    break;
                }
            }
            if (s[i]=='a'&&vis[0]){
                bool all_vis=1;
                for (int j=0;j<26;j++){
                    if (!vis[j]){
                        all_vis=0;
                        break;
                    }
                }
                if (all_vis){
                    cout<<"Impossible"<<endl;
                    return 0;
                }
            }
        }
    }
    for (int i=1;i<n;i++){
        int j=c[i-1];
        while (j>0&&s[i] != s[j]){
            j=c[j-1];
        }
        if (s[i]==s[j]) j++;
        c[i]=j;
    }
    for (int i=0;i<n;i++){
        if (c[i]!=b[i]){
            cout<<"Impossible"<<endl;
            return 0;
        }
    }
    for (int i=0;i<n;i++){
        cout<<s[i];
    }
    cout<<endl;
    return 0;
}