動態規劃思路:
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;
}