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

猜你喜欢

转载自www.cnblogs.com/liuzongxin/p/13380767.html