Statement
给定 \(n\) 个正整数 \(a_{1,2,...,n}\),要求构造出 \(n+1\) 个长度不超过 \(200\) 的字符串 \(s_1,s_2,...,s_{n+1}\),使得 \(\forall 1 \leq i \leq n\),\(s_i\) 和 \(s_{i+1}\) 的最长公共前缀长度为 \(a_i\)。
Limits
多组数据,数据组数 \(\leq 100\),\(1 \leq n \leq 100,0 \leq a_i \leq 50, \sum n \leq 100\)
Solution
考虑构造出足够长的 \(s_1\),然后对于每一个 \(1 < i \leq n+1\),将 \(s_i\) 的前 \(a_i\) 位构造得和 \(s_{i-1}\) 相同,后 \(|s_{i-1}|- a_i\) 位和 \(s_{i-1}\) 不同。
Code
# include <bits/stdc++.h>
# define rr
const int N=110,INF=0x3f3f3f3f;
char s[N];
int n;
int a[N];
char temp[N];
inline int read(void){
int res,f=1;
char c;
while((c=getchar())<‘0‘||c>‘9‘)
if(c==‘-‘)f=-1;
res=c-48;
while((c=getchar())>=‘0‘&&c<=‘9‘)
res=res*10+c-48;
return res*f;
}
int main(void){
int T=read();
while(T--){
n=read();
for(rr int i=1;i<=n;++i){
a[i]=read();
}
a[n+1]=0;
for(rr int i=1;i<=100;++i){
s[i]=‘a‘,putchar(‘a‘);
}
puts("");
for(rr int i=1;i<=n;++i){
for(rr int j=1;j<=100;++j){
if(j<=a[i]){
temp[j]=s[j];
}else{
temp[j]=(s[j]==‘z‘)?(‘x‘):‘z‘;
}
putchar(temp[j]);
}
puts("");
for(rr int j=1;j<=100;++j){
s[j]=temp[j];
}
}
}
return 0;
}
原文:https://www.cnblogs.com/liuzongxin/p/13380767.html