大意:
一个字符串是合法的当且仅当这个字符串循环同构的其他串的字典序都比它大。例如”ababa”是不合法的,而”aabab”是合法的,”abab”是不合法的。输出长度小于等于n的由前m个字符构成的第l到第r个合法串。
数据范围:n <= 30, 2 <= m <= 26, 1 <= l <= r <= 10^7, r – l < 10^5.
Solution
暴力拓展,考虑压着边界拓展和偏离边界的拓展方式(边界即为和开头相同)
#include<stdio.h>
#define cint const int &
int a[35],n,m,L,R,cas;
int dfs(cint dep,cint k,cint p)
{
int e=p==0?1:0;
if (R<k+e) return 0;
if (e && L<=k+e && k+e<=R)
{
for (int i=1;i<dep;i++) putchar(a[i]+'a'-1);
putchar('\n');
}
if (n<dep) return e;
for (int i=1;i<=m;i++)
{
if ((a[dep]=i)==a[p+1]) e+=dfs(dep+1,k+e,p+1);
else if (a[p+1]<a[dep]) e+=dfs(dep+1,k+e,0);
}
return e;
}
int main()
{
a[0]=-233333333;
while (~scanf("%d%d%d%d",&n,&m,&L,&R))
{
int r=0;
printf("Case %d:\n",++cas);
for (int i=1;i<=m;i++)
{
a[1]=i;
r+=dfs(2,r,0);
}
}
}