USACO prefix

/*
ID: fairyroad
TASK:prefix
LANG:C++
*/
#include<fstream>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");

vector<string> pri[26];
char src[200001];
size_t dp[200001];
size_t /*prinum=0, */src_len=0;

inline bool find(const string& s1)
{
    int index = s1[0]-'A';
    for(size_t i = 0; i <pri[index].size(); ++i)
        if(s1 == pri[index][i]) return true;
    return false;
}

int main()
{
    string str;
    size_t pri_max_len = 0;
    while(true)
    {
        fin >>str;
        if(str == ".") break;
        if(str.size() > pri_max_len) pri_max_len = str.size();
        pri[str[0]-'A'].push_back(str);
    }
    while(!fin.eof())
    {
        fin>>src[src_len];
        if (src[src_len] != '\n') ++src_len;
    }
    --src_len;
    string s0(1, src[src_len-1]);
    if(find(s0)) dp[src_len-1] = 1;
    for(int i = src_len-2; i >= 0; --i)
    {
        for(int j = i+1; j <= i+pri_max_len && j <= src_len; ++j)
        {
            string s(src+i, src+j);
            if(!find(s)) continue;
            if(dp[i] < dp[j]+j-i) dp[i] = dp[j]+j-i;
        }
    }
    fout<<dp[0]<<endl;
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章