zoukankan      html  css  js  c++  java
  • hdu 1251

    统计拼图

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
    Total Submission(s): 16960    Accepted Submission(s): 7304


    Problem Description
    Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
     

    Input
    输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每一个提问都是一个字符串.

    注意:本题仅仅有一组測试数据,处理到文件结束.
     

    Output
    对于每一个提问,给出以该字符串为前缀的单词的数量.
     

    Sample Input
    banana band bee absolute acm ba b band abc
     

    Sample Output
    2 3 1 0

    A字典树的第一道题

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    #include <string>
    using namespace std;
    
    struct edge{
        int u , v , letter , sum;
        edge(int a = 0 , int b = 0 , int c = 0 , int d = 0){
            u = a , v = b , letter = c , sum = d;
        }
    };
    vector<edge> e;
    vector<int> head , next;
    
    void add(int  u , int v , int letter , int sum){
        e.push_back(edge(u , v , letter , sum));
        next.push_back(head[u]);
        head[u] = next.size()-1;
        head.push_back(-1);
    }
    
    void addLibrary(string s){
        int u = 0 , index = 0;
        while(index < s.length()){
            int Next = head[u];
            while(Next != -1){
                if(e[Next].letter == s[index]-'a') break;
                Next = next[Next];
            }
            if(Next == -1) break;
            e[Next].sum++;
            index++;
            u = e[Next].v;
        }
        while(index < s.length()){
            add(u , head.size() , s[index]-'a' , 1);
            index++;
            u = head.size()-1;
        }
    }
    
    int query(string s){
        int u = 0 , index = 0 , Next;
        while(index < s.length()){
            Next = head[u];
            while(Next != -1){
                if(e[Next].letter == s[index]-'a') break;
                Next = next[Next];
            }
            if(Next == -1) return 0;
            index++;
            u = e[Next].v;
        }
        return e[Next].sum;
    }
    
    int main(){
        string dic;
        head.push_back(-1);
        while(getline(cin , dic)){
            if(dic.length() == 0) break;
            addLibrary(dic);
        }
        while(cin >> dic){
            printf("%d
    " , query(dic));
        }
        return 0;
    }
    


  • 相关阅读:
    数据结构化
    爬取校园新闻首页的新闻
    网络爬虫基础练习
    Hadoop综合大作业
    理解MapReduce
    熟悉常用的HBase操作
    熟悉常用的HDFS操作
    爬虫大作业
    数据结构化与保存
    爬取校园新闻首页的新闻
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5036819.html
Copyright © 2011-2022 走看看