zoukankan      html  css  js  c++  java
  • (step5.1.2)hdu 1305(Immediate Decodability——字典树)

    题目大意:输入一系列的字符串,判断这些字符串中是否存在其中的一个字符串是另外一个字符串的前缀。。

    如果是,输出Set 。。 is not immediately decodable

    否则输出Set .. is immediately decodable

    说的通俗点,就是判断一个字符串是否是两外一个字符串的前缀


    解题思路:

    这是一道字典树的题。一开始的时候,我用c/c++来写,然后是100行写完了,就是不知道哪里错了

    这时,我实在忍不住了。直接就用java来写了


    代码如下:(注意以下代码在submit的时候是需要对格式改一下的。。。但我这里可懒得改了)

    package com.njupt.acm;
    
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.Set;
    
    public class HDU_1305 {
    
    	public static void main(String[] args) {
    		Scanner scanner = new Scanner(System.in);
    		
    		int counter = 1;
    		while (scanner.hasNext()) {
    			Set set = new HashSet();
    			String str = scanner.next();
    			boolean flag = true;
    
    			set.add(str);
    			while (scanner.hasNext()) {
    				str = scanner.next();
    				if (str.equals("9")) {
    					if(flag){
    						System.out.println("Set "+(counter++)+" is immediately decodable");
    					}else{
    						System.out.println("Set "+(counter++)+" is not immediately decodable");
    					}
    					break;
    				}
    				Iterator<String> iter = set.iterator();
    				while (iter.hasNext()) {
    					String str1 = iter.next();
    					if (str.startsWith(str1) || str1.startsWith(str)) {
    						flag = false;
    						break;
    					}
    				}
    				if(flag){
    					set.add(str);
    				}
    			}
    		}
    	}
    }
    


    以下附上让人心碎的c/c++代码

    /*
     * 1305_1.cpp
     *
     *  Created on: 2013年8月24日
     *      Author: Administrator
     */
    
    #include <iostream>
    
    using namespace std;
    
    const int maxn = 2;
    struct node {
    	int count;
    	node* next[maxn];
    };
    
    node* root;
    node* newset() {
    	node* current;
    	current = (node*) malloc(sizeof(node));
    
    	int i;
    	for (i = 0; i < maxn; ++i) {
    		current->next[i] = NULL;
    	}
    
    	current->count = 1;
    	return current;
    }
    
    void insert(char* s) {
    	node* current;
    	int len = strlen(s);
    	if (len == 0) {
    		return;
    	}
    	current = root;
    
    	int i;
    	for (i = 0; i < len; ++i) {
    		if (current->next[s[i] - '0'] != NULL) {
    			current = current->next[s[i] - '0'];
    			current->count = current->count + 1;
    		} else {
    			current->next[s[i] - '0'] = newset();
    			current = current->next[s[i] - '0'];
    		}
    	}
    }
    
    int find(char* s) {
    	node* current;
    	int len = strlen(s);
    	if (len == 0) {
    		return 0;
    	}
    	current = root;
    
    	int i;
    	for (i = 0; i < len; ++i) {
    		if (current->next[s[i] - '0'] != NULL) {
    			current = current->next[s[i] - '0'];
    		} else {
    			return 0;
    		}
    	}
    
    	return current->count;
    }
    
    int main() {
    	char str[15][15];
    		int line = 0, count = 1;
    
    		while (scanf("%s", str[line]) != EOF) {
    			root = newset();
    			line = 0;
    			bool flag = true;
    			insert(str[line++]);
    			while (scanf("%s", str[line]) != EOF) {
    				if (str[line][0] == '9') {
    					break;
    				}else{
    					insert(str[line++]);
    				}
    
    			}
    
    			int i;
    			for (i = 0; i < line; ++i) {
    				if (find(str[i]) > 1) {
    					flag = false;
    					break;
    				}
    			}
    
    			if (flag) {
    				printf("Set %d is immediately decodable
    ", count++);
    			} else {
    				printf("Set %d is not immediately decodable
    ", count++);
    			}
    
    		}
    
    		delete root;
    }
    



  • 相关阅读:
    P1162 填涂颜色
    P1238 走迷宫
    U68364 _GC滑迷宫
    P4783 【模板】矩阵求逆
    P2613 有理数取余
    koa1链接mongodb
    koa的跨域访问
    mongodb 降序
    mongodb 分页(limit)
    mongodb 查询数据
  • 原文地址:https://www.cnblogs.com/riskyer/p/3279693.html
Copyright © 2011-2022 走看看