/*
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;
}
USACO prefix
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.