题意:
把字符串变成U型,左边n1个,右边n3个,底部n2个。
主要是理解这一句:
n1 = n3 = max { k| k <= n2 for all 3 <= n2 <= N } with n1 + n2 + n3 - 2 = N.
这句话的意思是
1. n1等于n3,
2. 对于3<=n2<=N ,n1取n2确定时所能取到的k的最大值。 且必须满足 n1 + n2 + n3 - 2 = N
3.从k<=n2可以看出,每确定一个n2,n1是肯定小于等于n2的。即有
n1<=n2
而n2=N+2-2*n1
代入得n1<=(N + 2) / 3
故n1取这个值即可。
//628K 94MS
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
using namespace std;
#define inf 0x3f3f3f3f
#define M 100000
int main(){
string ins;
cin>>ins;
int len = ins.length();
int n1,n2,n3,i,j;
// n1 <= (n2=(N+2)-2n1)
n1 = (len + 2) / 3;
n2 = len + 2 -2*n1;
n3 = n1;
for(i=0;i<n1-1;i++)
{
printf("%c",ins[i]);
for(j = 0;j < n2-2;j++)
{
cout<<" ";
}
printf("%c\n",ins[len - i -1]);
}
for(j = 0;j < n2;j++)
{
printf("%c",ins[i+j]);
}
cout<<endl;
return 0;
}