1. 程式人生 > 實用技巧 >Codeforces Round #659【部分題解】

Codeforces Round #659【部分題解】

Div.2 A

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