| 比赛 |
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;
}