UVa 10950 - Bad Code

题目:有一种编码方式。串仅仅有小写字母构成,每一个小写字母相应一个数字,如今给你妆化后的数字串,

问有多少个原串与之相应,注意数字串里可能有一个前导0。

分析:搜索。按字母顺序存储映射表,按字母顺序匹配搜索就可以。

说明:注意最多仅仅输出前100个。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

char buf[101];

int  code[128];
char maps[128][5];
char letter[128];

int  Count = 0;
char save[101];
void dfs(int s, int d, int n, int m)
{
	if (Count == 100) return;
	char word[101];
	if (s == n) {
		save[d] = 0;
		printf("%s\n",save);
		Count ++;
		return;
	}
	for (int k = 0 ; k < m ; ++ k) {
		int count = 0;
		for (int i = s ; i < n ; ++ i) {
			word[count ++] = buf[i];
			word[count] = 0;
			if (!strcmp(word, maps[k]) || (word[0] == ‘0‘ && !strcmp(word+1, maps[k]))) {
				save[d] = letter[k];
				dfs(i+1, d+1, n, m);
			}
		}
	}
}

int main()
{
	int  n,t = 1;
	char c;
	while (~scanf("%d",&n) && n) {
		memset(code, 0, sizeof(code));
		for (int i = 0 ; i < n ; ++ i) {
			getchar();
			scanf("%c",&c);
			scanf("%d",&code[c]);
		}

		int count = 0;
		for (int i = ‘a‘ ; i <= ‘z‘ ; ++ i)
			if (code[i] > 0 && code[i] < 100) {
				letter[count] = i;
				if (code[i] > 9) {
					maps[count][0] = code[i]/10 + ‘0‘;
					maps[count][1] = code[i]%10 + ‘0‘;
					maps[count][2] = 0;
				}else {
					maps[count][0] = code[i] + ‘0‘;
					maps[count][1] = 0;
				}
				count ++;
			}

		scanf("%s",buf);
		printf("Case #%d\n",t ++);
		Count = 0;
		dfs(0, 0, strlen(buf), count);
		printf("\n");
	}
	return 0;
}
时间: 2024-10-20 03:11:16

UVa 10950 - Bad Code的相关文章

UVA 146 ID code(next_permutation的运用)

ID code It is 2084 and the year of Big Brother has finally arrived, albeit a century late. In order to exercise greater control over its citizens and thereby to counter a chronic breakdown in law and order, the Government decides on a radical measure

uva 11557 - Code Theft(KMP)

题目链接:uva 11557 - Code Theft 题目大意:给定n个文本,每个文本有一个文本名,现在给出一个文本,求给定文本和n个文本中连续相同行数最大值,并且输出文本名,注意为0时不用输出其它的文本名. 解题思路:将每个字符串用映射成一个hash值,然后对匹配文本枚举后缀,建立失配数组进行KMP匹配,记录下每个文本的匹配最大值. #include <cstdio> #include <cstring> #include <map> #include <st

UVA 11557 - Code Theft (KMP + HASH)

UVA 11557 - Code Theft 题目链接 题意:给定一些代码文本,然后在给定一个现有文本,找出这个现有文本和前面代码文本,重复连续行最多的这些文本 思路:把每一行hash成一个值,然后对于每一个文本计算最大匹配值,枚举后缀,然后利用KMP去找即可 代码: #include <cstdio> #include <cstring> #include <vector> #include <string> #include <iostream&g

UVA 11754 - Code Feat(数论)

UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题,分两种情况讨论 1.所有x之积较小时候,暴力枚举每个集合选哪个y,然后中国剩余定理求解 2.所有x之积较大时候,选定一个k/x尽可能小的序列,枚举x * t + y (t = 1, 2, 3...)去暴力求解. 代码: #include <stdio.h> #include <string.

uva 12436 - Rip Van Winkle&#39;s Code(线段树)

题目链接:uva 12436 - Rip Van Winkle's Code 题目大意:四种操作,操作见题目. 解题思路:即用线段树维护一个等差数列,因为一个等差加上一个等差还是一个等差数列,所以对于每个节点记录区 间左端的值,也就是首项,以及公差即可.因为还有一个S操作,所以要开一个标记记录区间值是否相同. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ty

UVA 12436-Rip Van Winkle&#39;s Code(线段树的区间更新)

题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = data[i] + (i - st + 1); } void B( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = data[i] + (nd - i + 1); } void C( int st, int nd, int x

Uva 12436 Rip Van Winkle&#39;s Code

Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequired to perform three types of update operations (A, B, C), and one query operation S over an arraydata[]. Initially all elements of data are equal to 0

uva 11754 - Code Feat(中国剩余定理+暴力)

题目链接:uva 11754 - Code Feat 题目大意:求一个数N,给出C和S,表示有C个条件,每个条件有X 和 k,然后是该个条件的k个yi,即NmodX=yj,输出满足的最小的S个N,要求正整数. 解题思路:total为所有的k的乘积,也就是可以作为一组完整限定条件的可能数,当个确定条件可以用中国剩余定理处理.但是如果total太大的话,处理的情况比较多.不过total数大的时候,可以通过枚举N来判断,找到一组k/x最小的最为枚举基准,然后判断即可. #include <cstdio

UVA 12436 - Rip Van Winkle&#39;s Code(线段树)

UVA 12436 - Rip Van Winkle's Code 题目链接 题意:区间修改一个添加等差数列,一个把区间设为某个值,然后询问区间和 思路:关键在于等差数列的地方,线段树的每个结点添加一个首项和公差,由于等差数列加上一个等差数列还是一个等差数列,利用这个性质就可以进行维护了,注意set操作会覆盖掉等差数列的操作 代码: #include <cstdio> #include <cstring> #define lson(x) ((x<<1)+1) #defi