列表

详情


NC25155. 烙印

描述

奶牛们非常兴奋,因为:农民 John 决定使用 RFID 标签的方式作为奶牛的烙印,取代以前用热铁给牛烙印的方式,因为那样会产生剧烈的疼痛。
RFID 标签包含一个代码,是长度为 N (3 <= N <= 15) 的字符串(每个字符在范围 'A'..'Z')。在一个代码中,不含有两个相同的字符。每个位置上选取的字符取自那个位置给定的一个字符集。每个位置的字符集各自都是按字母序列升序给出。
一台机器按照字典序生成所有代码。每一批新的牛都使用下一个未使用的代码集。FJ 跟踪记录了之前已经有多少代码被使用了。
帮助 FJ 确定 下一批牛的 RFID 代码集。给出开始编号和结束编号(1 <= 开始编号start < 结束编号finish <= 22,000,000 而且结束编号-开始编号 < 2000),输出(按照字典序)被使用的RFID 代码集。请看样例获取更多信息。

输入描述

Line 1: 三个用空格分隔的整数,分别是: N, start, 和 finish。
Lines 2..N+1: 第 i+1 行含有若干个 (1..26) 字符,表示RFID代码在第i个
位置可以取的字符集。

输出描述

Lines 1..finish-start+1: 第 i 行是排在start+i-1的 RFID 代码。

示例1

输入:

4 6 13
ABC
CDELQ
CFH
ABC

输出:

ADHB
ADHC
AECB
AEFB
AEFC
AEHB
AEHC
ALCB

说明:

RFID 代码有4位;输出第6个到第13个代码。
这里是最前面的 20 个代码:
1 ACFB 5 ADFC 9 AEFB 13 ALCB 17 ALHC
2 ACHB 6 ADHB 10 AEFC 14 ALFB 18 AQCB
3 ADCB 7 ADHC 11 AEHB 15 ALFC 19 AQFB
4 ADFB 8 AECB 12 AEHC 16 ALHB 20 AQFC

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Pascal(fpc 3.0.2) 解法, 执行用时: 199ms, 内存消耗: 344K, 提交时间: 2019-06-16 10:47:10

var
 c:array['A'..'Z']of boolean;
 a,b:array[1..26]of char;
 i,j,yi,n,er,sum,t:longint;
 s:array[1..15]of string;
procedure dfs(x:longint);
var
 k:longint;
begin
 if x=n+1 then begin
                t:=t+1;
                if t>er then halt;
                if(t>=yi)and(t<=er) then begin
                                          for k:=1 to n do
                                           write(b[k]);
                                          writeln;
                                         end;
               end
          else begin
                for k:=1 to length(s[x]) do
                 begin
                  if c[s[x][k]]=false then
                  begin
                   b[x]:=s[x][k];
                   c[s[x][k]]:=true;
                   dfs(x+1);
                   c[s[x][k]]:=false;
                  end;
                 end;
               end;
end;
begin
 readln(n,yi,er);
 for i:=1 to n do
  readln(s[i]);
 dfs(1);
end.

C++11(clang++ 3.9) 解法, 执行用时: 156ms, 内存消耗: 612K, 提交时间: 2019-06-14 14:50:36

#include<bits/stdc++.h>
#define maxn 30
using namespace std;
int sum[maxn],a[maxn][maxn],ans[maxn],n,l,r,a1,t[1010];
char s[maxn];
void dfs(int p){
	if(a1>r)return;
	if(p==n+1){
		a1++;
		if(a1>=l&&a1<=r){
			for(int i=1;i<=n;i++)cout<<(char)ans[i];
			cout<<endl;
		}
		return;
	}
	for(int j=1;j<=sum[p];j++){
		if(t[a[p][j]])continue;
		t[a[p][j]]=1;ans[p]=a[p][j];
		dfs(p+1);t[a[p][j]]=0;
	}
	return;
}
int main(){
	scanf("%d%d%d",&n,&l,&r);
	for(int i=1;i<=n;i++){
		scanf("%s",s+1);a1=strlen(s+1);
		for(int j=1;j<=a1;j++)a[i][j]=(int)s[j];
		sort(a[i]+1,a[i]+1+a1);sum[i]=a1;
	}
	a1=0;dfs(1);
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 122ms, 内存消耗: 504K, 提交时间: 2019-06-14 23:11:06

#include <iostream>
#include <stdio.h>
using namespace std;
int n,s,e,cnt=0;
string model[20];
char mark[20],dead[300];

void dfs(int pos)
{
	if(pos>n)
	{
		cnt++;
		if(cnt>=s)
		{
			printf("%s\n",mark+1);
			if(cnt==e) exit(0);
		}
		return;
	}
	for(int i=0;i<model[pos].size();i++)
	{
		char ch=model[pos][i];
		if(dead[ch]) continue;
		dead[ch]=1;mark[pos]=ch;
		dfs(pos+1);
		dead[ch]=0;
	}
	return;
}

int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>s>>e;
	for(int i=1;i<=n;i++) cin>>model[i];
	dfs(1);
	return 0;
}

上一题