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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法训练 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计数法 生成组合+模拟的主要内容,如果未能解决你的问题,请参考以下文章

「CSP-S模拟赛」2019第二场

NOIP2006普及组 Jam的计数法

0827模拟赛解题报告(16年暑假最后一次模拟赛)

题目:Jam的计数法(水题)

Jam的计数法

洛谷 P1061 Jam的计数法