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中找不到合适的元素。

 

/*
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;
}

你可能感兴趣的:(USACO)