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

  • 相关阅读:
    String的equals和hashCode方法
    查看oracle中表的索引
    初识RESTful
    linux安装字体库(simSun为例)
    排序之快排(JS)
    面向对象的三个基本特征 和 五种设计原则
    排序之希尔排序(JS)
    关于正则表达式
    Oracle 表分区介绍与使用
    一个复杂关联的sql
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5351417.html
Copyright © 2020-2023  润新知