#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<cstring>
#include<assert.h>
using namespace std;
typedef long long ll;//QAQ
const string shift="--------------------";
const int M=3e6+7;
int t, n, L, P; string st[M]; int final[M];
ll a[M], sa[M]; long double f[M];
//f[i] 事前i个句子排版最小不协调度。
struct Q{
int j, l, r;
}p[M];
long double ppp(ll _a, int b){
long double a = _a;
long double res=1;
while(b>0) {if(b&1) res*=a; a=a*a, b>>=1;}
return res;
}
long double val(int i, int j){
return f[j]+ppp(abs(sa[i]-sa[j]+(i-j-1-L)), P);
}
int v[M], qwq;
int main(){
// freopen("2.in","r",stdin);
// freopen("3.out","w",stdout);
scanf("%d", &t);
while(t--){
memset(v, 0, sizeof(v)); qwq=0;
memset(final, 0, sizeof(final));
memset(p, 0, sizeof(p));
//多测不清空 爆零两行泪
scanf("%d%d%d", &n, &L, &P);
for(int i=1; i<=n; i++){
cin>>st[i]; a[i]=st[i].size();
sa[i]=sa[i-1]+a[i];//总之先写上…!
}
int l=1, r=1; f[0]=0;
p[l]={0, 1, n};
bool op=0;
for(int i=1; i<=n; i++){
for(int j=l;j<=l;j++){
cerr<<p[j].j<<'\n';
}
while(l<r && p[l].r<i){
l++;
}
p[l].l=i;
int j=p[l].j;
f[i]=val(i, j); int pos;
v[i]=p[l].j;
// if(f[i]>1e18){
// op=1; break;
// }
while(r>=l&&val(p[r].l, i)<=val(p[r].l, p[r].j)){
pos=p[r].l; r--;
}
if(r>=l&&val(p[r].r, i)<=val(p[r].r, p[r].j)){
int ll=p[r].l, rr=p[r].r;
while(ll<rr){
int mid=(ll+rr)>>1;
if(val(mid, i)<=val(mid, p[r].j)) rr=mid;
else ll=mid+1;
}
pos=ll;//二分肯定没写错。(点头
p[r].r=pos-1;
}
p[++r]={i, pos, n};
}
int top=0;
for(int i=n; i; i=v[i]){
cerr<<i<<endl;
final[++top]=i;
}
reverse(final+1, final+top+1);
if(f[n]>1e18) printf("Too hard to arrange\n");
else{
printf("%.0Lf\n", f[n]);
for(int i=0; i<top; i++){
for(int j=final[i]+1; j<final[i+1]; j++){
cout<<st[j]<<" ";
}
cout<<st[final[i+1]]<<endl;
}
}
cout<<shift;
if(t>0) printf("\n");
}
return 0;
}
似乎是f[n]的锅,但是交上去就ac惹qwq
然后一测IDE居然WA了??