USACO 2.3.1 Longest Prefix

動態規劃思路:

dp[j]爲1則dp[i]爲1    (j < i 且 j+1到i爲一個集合元素)

#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <map>
//#define LOCAL

using namespace std;

#ifdef LOCAL
ofstream fout ("out.txt");
ifstream fin ("in.txt");
#else
ofstream fout ("prefix.out");
ifstream fin ("prefix.in");
#endif

map <int, int> ok;
int dp[1000000] = {1};
char c[10];
char s[1000000];
int len_s = 1;

int Hash(char *c)
{
	int len = strlen(c);
	int d = 0;
	for (int i = len-1; i >= 0; --i)
		d = d * 171 + (c[i]-'A'+1);
	return d;
}

int main() {

	while(fin>>c)
	{
		if(c[0]=='.')
			break;
		ok[Hash(c)] = 1;
	}

	char now;
	
	while(fin>>now)
	{
		if(!(now>='A'&&now<='Z'))
			continue;

		s[len_s++] = now;
        
		int hash_key = 0;
		for (int i = 0; i < 10; ++i)
		{
			int temp = len_s - 1 - i;
			if(temp<=0)
				break;
			hash_key = hash_key*171 + (s[temp]-'A'+1);
			if(ok.count(hash_key)!=0&&dp[temp-1])
			{
				dp[len_s-1] = 1;
				break;
			}
		}
	}
	for (int i = len_s-1; i >= 0; --i)
	{
		if(dp[i]||i==0)
		{
			fout<<i<<endl;
			break;
		}
	}
    return 0;
}



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