zoukankan      html  css  js  c++  java
  • USACO prefix TrieTree + DP

    /*
    ID:kevin_s1
    PROG:prefix
    LANG:C++
    */
    
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <map>
    #include <set>
    #include <algorithm>
    #include <cstdlib>
    #include <list>
    #include <cmath>
    
    using namespace std;
    
    #define sigma_size 26
    #define MAX_LEN 2000001
    
    //gobal variable====
    
    struct trie_node{
    	trie_node* next[sigma_size];
    	bool is_terminal;
    	trie_node(){
    		memset(next, 0, sizeof(next));
    		is_terminal = false;
    	}
    };
    
    
    struct Trie{
    	trie_node* root;
    	int size;
    	int idx(char ch){
    		return ch - 'A';
    	}
    	Trie(){
    		root = new trie_node();
    		size = 1;
    	}
    
    	void Insert(string str){
    		trie_node* cur = root;
    		int len = str.length();
    		for(int i = 0; i < len; i++){
    			int ch = idx(str[i]);
    			if(cur->next[ch] == NULL){
    				cur->next[ch] = new trie_node();
    			}
    			cur = cur->next[ch];
    		}
    		cur->is_terminal = true;
    	}
    
    	bool Query(string str){
    		trie_node* cur = root;
    		int len = str.length();
    		for(int i = 0; i < len; i++){
    			int ch = idx(str[i]);
    			if(cur->next[ch] == NULL){
    				return false;
    			}
    			else
    				cur = cur->next[ch];
    		}
    
    		if(cur->is_terminal)
    			return true;
    		else
    			return false;
    
    	}
    	
    };
    
    int DP[MAX_LEN];
    string S;
    //==================
    
    
    //function==========
    
    //==================
    
    int main(){
    	freopen("prefix.in","r",stdin);
    	freopen("prefix.out","w",stdout);
    	Trie prefix;
    	string str;
    	char ch[201];
    	while(scanf("%s",ch) && strcmp(ch, ".") != 0){
    		str = ch;
    		prefix.Insert(str);
    	}
    	str.clear();
    	int c;
    	while((c = getchar()) != EOF){
    		if(!isspace(c))
    			S = S + (char)c;
    	}
    	int Len = S.length();
    	memset(DP, 0, sizeof(DP));
    	DP[Len] = 0;
    	for(int i = Len - 1; i >= 0; --i){
    		for(int j = 1; j <= 10 && (i + j - 1) < Len; ++j){
    			string sub = S.substr(i, j);
    			if(prefix.Query(sub)){
    				if(DP[i + j] + j > DP[j])
    					DP[i] = DP[i + j] + j;
    			}
    		}
    	}
    	cout<<DP[0]<<endl;
    	return 0;
    }
    

  • 相关阅读:
    uva 489 Hangman Judge(水题)
    中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)
    中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)
    poj 1039 Pipe(叉乘。。。)
    CodeForces 135 B. Rectangle and Square(判断正方形和 矩形)
    poj 1265 Area( pick 定理 )
    poj 2031 Building a Space Station(prime )
    hdu 4502 吉哥系列故事——临时工计划(dp)
    拉格朗日插值
    [USACO18DEC]The Cow Gathering P
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5351417.html
Copyright © 2011-2022 走看看