2012-C08-team5-problem-B
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
const long long INF = 1ll<<60;
long long MUL(long long x, long long y){
return __builtin_clzll(x)+__builtin_clzll(y)<=64?INF:x*y;
}
long long ADD(long long x, long long y){
return x=x+y>INF?INF:x+y;
}
int main(){
int n,m;
long long idx,cnt[2205]={1},pfx[2205]={1};
char str[205];
string a[100],ans;
vector<int> u[100],v[100];
sscanf(gets(str),"%d%d%lld",&n,&m,&idx); idx--;
for(int i=0;i<n;i++) a[i]=gets(str);
for(int i=0;i<m;i++) for(int j=0;j<n;j++)
cnt[i+a[j].size()]=ADD(cnt[i+a[j].size()],cnt[i]);
if(idx>=cnt[m]) return puts("-"),0;
for(int i=0;i<n;i++) if(a[i].size()<=m) u[i].push_back(0);
for(int l=0;l<m;l++){
long long use[128]={};
for(int i=0;i<n;i++){
for(size_t j=0;j<u[i].size();j++){
int x=u[i][j];
long long p=pfx[l-x],q=cnt[m-l+x-a[i].size()];
use[int(a[i][x])]=ADD(use[int(a[i][x])],MUL(p,q));
}
}
int c,start=0;
for(c='a';use[c]<=idx;idx-=use[c++]);
ans+=char(c);
for(int i=0;i<n;i++){
for(size_t j=0;j<u[i].size();j++){
int x=u[i][j];
if(c==a[i][x] && a[i].size()!=x+1) v[i].push_back(x+1);
if(c==a[i][x] && a[i].size()==x+1){
pfx[l+1]=ADD(pfx[l+1],pfx[l-x]);
start=1;
}
}
}
for(int i=0;i<n;v[i++].clear()){
if(start && l+a[i].size()<m) v[i].push_back(0);
u[i].swap(v[i]);
}
}
puts(ans.c_str());
}
}}}
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
const long long INF = 1ll<<60;
long long MUL(long long x, long long y){
return __builtin_clzll(x)+__builtin_clzll(y)<=64?INF:x*y;
}
long long ADD(long long x, long long y){
return x=x+y>INF?INF:x+y;
}
int main(){
int n,m;
long long idx,cnt[2205]={1},pfx[2205]={1};
char str[205];
string a[100],ans;
vector<int> u[100],v[100];
sscanf(gets(str),"%d%d%lld",&n,&m,&idx); idx--;
for(int i=0;i<n;i++) a[i]=gets(str);
for(int i=0;i<m;i++) for(int j=0;j<n;j++)
cnt[i+a[j].size()]=ADD(cnt[i+a[j].size()],cnt[i]);
if(idx>=cnt[m]) return puts("-"),0;
for(int i=0;i<n;i++) if(a[i].size()<=m) u[i].push_back(0);
for(int l=0;l<m;l++){
long long use[128]={};
for(int i=0;i<n;i++){
for(size_t j=0;j<u[i].size();j++){
int x=u[i][j];
long long p=pfx[l-x],q=cnt[m-l+x-a[i].size()];
use[int(a[i][x])]=ADD(use[int(a[i][x])],MUL(p,q));
}
}
int c,start=0;
for(c='a';use[c]<=idx;idx-=use[c++]);
ans+=char(c);
for(int i=0;i<n;i++){
for(size_t j=0;j<u[i].size();j++){
int x=u[i][j];
if(c==a[i][x] && a[i].size()!=x+1) v[i].push_back(x+1);
if(c==a[i][x] && a[i].size()==x+1){
pfx[l+1]=ADD(pfx[l+1],pfx[l-x]);
start=1;
}
}
}
for(int i=0;i<n;v[i++].clear()){
if(start && l+a[i].size()<m) v[i].push_back(0);
u[i].swap(v[i]);
}
}
puts(ans.c_str());
}