USACO2.3 Longest Prefix(prefix)

        對集合P中的某個元素,假設其長度爲length,找出全部與str[i]~str[i+length-1]徹底重合的元素,比較ans和i+length的大小,ans=max{ans,i+length },求每個合適元素下的ans,取最大值,此即爲dp[i]。對str每個位置i(0~str.length)進行遍歷,直到在集合P中找不到合適的元素。ios

 

/*
ID: jzzlee1
PROG: prefix
LANG: C++
*/
//#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<utility>
using namespace std;
ifstream cin("prefix.in");
ofstream cout("prefix.out");
int ans;
string str;
vector<pair<string,int> > vec;
bool check(int i,int j)
{
	bool flag=1;
	for(int k=0;k!=vec[j].second;++k)
		if(str[i+k]!=vec[j].first[k] )
		{
			flag=0;
			break;
		}
	return flag;
}
int main()
{
	string s;
	
	while(cin>>s&&s!=".")
			vec.push_back(make_pair(s,s.length()));
	while(cin>>s)
		str+=s;
	int i,j;
	for(i=0;i!=str.length();++i)
	{
		for(j=0;j!=vec.size();++j)
		{
			if(i+vec[j].second>str.length())
				continue;
			if(check(i,j))
				ans=ans>i+vec[j].second?ans:i+vec[j].second;
		}
		if(i+1>ans)
			break;
	}
	cout<<ans<<endl;
    return 0;
}
相關文章
相關標籤/搜索