没有陈高远说的特判肿么回事
#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; }