题目链接https://www.jisuanke.com/contest/7332
纯粹的画画题(可光题意就理解了一年)
此生再也不愿意做这种题(流泪)
#include<bits/stdc++.h>
using namespace std;
typedef long double db;
const int N=1e3+7;
int t,cs;
int n;
vector<string>vc[N];
string s,ss;
int len[N];
vector<int>id[N];
int tot[N],num;
struct Node{
string s[8];
}a[N];
void solve(int x){
for(int i=0;i<8;i++) a[x].s[i]="";
for(int i=1;i<=len[x]+2;i++) a[x].s[0]+="#";
int up=(6-vc[x].size())/2;
for(int i=1;i<=up;i++){
a[x].s[i]+="#";
for(int j=1;j<=len[x];j++) a[x].s[i]+=" ";
a[x].s[i]+="#";
}
for(int i=up+1,j=0;j<vc[x].size();i++,j++){
a[x].s[i]+="#";
int le=(len[x]-vc[x][j].length())/2;
for(int j=1;j<=le;j++) a[x].s[i]+=" ";
a[x].s[i]+=vc[x][j];
while(a[x].s[i].length()<len[x]+1) a[x].s[i]+=" ";
a[x].s[i]+="#";
}
for(int i=up+1+vc[x].size();i<7;i++){
a[x].s[i]+="#";
for(int j=1;j<=len[x];j++) a[x].s[i]+=" ";
a[x].s[i]+="#";
}
for(int i=1;i<=len[x]+2;i++) a[x].s[7]+="#";
}
int stlen[N];
char ans[N][N];
int ps[N][N];
stack<int>st[N];
int top;
void draw(int x,int y,int c){
for(int i=x,ii=0;i<8+x;i++,ii++){
for(int j=y,k=0;k<len[c]+2;j++,k++){
ans[i][j]=a[c].s[7-ii][k];
top=max(top,i);
}
}
}
char c[N];
int main()
{
scanf("%d",&t);
while(t--){
memset(ps,0,sizeof(ps));
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
ans[i][j]=' ';
}
}
memset(stlen,0,sizeof(stlen));
memset(tot,0,sizeof(tot));
memset(len,0,sizeof(len));
for(int i=0;i<N;i++){
while(!st[i].empty()) st[i].pop();
id[i].clear();
vc[i].clear();
}
scanf("%d",&n);
getchar();
top=0;
for(int i=1;i<=n;i++){
vc[i].clear();
ss="";
len[i]=0;
gets(c);
ss="";
int llll=strlen(c);
for(int j=0;j<llll;j++){
if(c[j]=='#') len[i]=max(len[i],(int)ss.length()),vc[i].push_back(ss),ss="";
else ss+=(c[j]);
}
vc[i].push_back(ss);
len[i]=max(len[i],(int)ss.length());
solve(i);
}
printf("Can Stack #%d:\n",++cs);
for(int i=1;i<=6;i++) printf(" %d",i);
printf("\n");
for(int i=1;i<=6;i++) printf("1234567890");
printf("\n");
memset(stlen,0,sizeof(stlen));
int mx=0;
int ri=-2;
num=0;
for(int i=1;i<=n;i++){
bool flag=false;
for(int j=1;j<=num;j++){
if(stlen[j]>len[i]){
int le=(stlen[j]-len[i])/2;
ps[j][st[j].size()+1]=ps[j][st[j].size()]+le;
st[j].push(i);
draw((st[j].size()-1)*8,ps[j][st[j].size()],i);
flag=true;
stlen[j]=len[i];
break;
}
}
if(flag==false){
num++;
draw(0,ri+2,i);
while(!st[num].empty()) st[num].pop();
stlen[num]=len[i];
st[num].push(i);
ps[num][1]=ri+2;
ri+=3+len[i];
}
}
for(int i=top;i>=0;i--){
int ri=100;
for(int j=100;j>0;j--){
if(ans[i][j]==' ') ri=j;
else break;
}
for(int j=0;j<ri;j++){
printf("%c",ans[i][j]);
}
printf("\n");
}
printf("\n");
}
}
/**
10
5
1000000000#111#1111111111
1#1#1#1
2#23#53
9999999999999999
100#100
5
10000000
100#100
1000#10
10000#1
1
*/