没有陈高远说的特判肿么回事
#include <cstdio>
#include <cstdlib>
int n,a[2000],s[2000];
int check(int x)
{
int sum=0;
for (int i=1;i<=x;i++) {
int flag=1;
for (int k=0,j=x-1;j>=1;j--) {
if (j-(x-i)<=0) break;
for (k=0;k<=x-i;k++)
if (a[i+k]!=a[j-(x-i)+k]) break;
if (k>x-i) {flag=0;break;}
}
sum+=flag;
}
return sum;
}
void getout(int x)
{
for (int i=1;i<=x;i++) printf("%c",a[i]+'a');
exit(0);
}
void dfs(int x,int ans,int dep)
{
if (ans==n) getout(x-1);
if (x>dep) return ;
for (int i=0;i<=25;i++) {
a[x]=i;
int sum=check(x);
if (ans+sum+s[dep]-s[x]<n) continue;
dfs(x+1,ans+sum,dep);
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d\n",&n);
for (int i=1;i<=24;i++) s[i]=s[i-1]+i;
// if (4==n) dfs(1,0,4);
for (int i=1;i<=24;i++) dfs(1,0,i);
return 0;
}