http://lx.lanqiao.cn/problem.page?gpid=T94
题意:给出s,t,w<=26 string由s,t组成的w位递增字符,给出string 求出它之后的5个递增排列
最大字符为t,生成下一个排列,模拟t进制+1即可,因为排列要严格递增 第j个字符最大为‘a‘+t -(w-j) 第j个字符+1后,生成b[j]开头的最小递增字典序,从该位至末位字母递增,公差为1
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e3+20; int s,t,w; char a[N],b[N]; void solve() { strcpy(b,a); int j,i=w,count=0; while(--i>=0) { j=i; while(b[j]+1 <= ‘a‘+t-(w-j))//第j个字符的最大值 { b[j]+=1; while(++j<w) { b[j]=b[j-1]+1;//后面+1,该递增字典序最小. } count++; printf("%s\n",b); if(count==5) return; j=w-1;//递增后,每次最后一位+1 } i=j; } } int main() { while(cin>>s>>t>>w) { scanf("%s",a); solve(); } return 0; }
时间: 2024-10-12 02:55:12