• (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;
    }
    



  • 相关阅读:
    站立会议(二)
    站立会议(一)
    电梯演讲 作业派
    《你的灯亮着么》三四篇
    《你的灯亮着么》一二篇
    找一
    水王2
    搜狗输入法使用评价
    找水王问题
    典型用户及用户场景分析
  • 原文地址:https://www.cnblogs.com/riskyer/p/3279693.html
Copyright © 2020-2023  润新知