首页 > 代码库 > 算法训练 JAM计数法 生成组合+模拟

算法训练 JAM计数法 生成组合+模拟

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;
} 

  

 

算法训练 JAM计数法 生成组合+模拟