题目的意思是给出好一些单词...再给一个长串(多行的接成一行)..问由这些单词一个一个接着一个(可重复)最长能组成所给字符串的前缀...
有点01背包的思想...用一个bool数组来记录字符串的某个位置能否被拓展到..并且在更新拓展位置时同样也是以前面已经拓展的点来看后面(枚举所有的单词,看能拓展到后面那哪些点)..因为所给的单词最长也就10..所以总的来看这种方法效率还是可以接受了.
Program:
/*
ID: zzyzzy12
LANG: C++
TASK: prefix
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
string s,a[205];
bool g[300002];
char str[81];
int num,k,i,j,len,l[205],ans;
int main()
{
freopen("prefix.in","r",stdin);
freopen("prefix.out","w",stdout);
num=0;
scanf("%s",str);
while (str[0]!='.')
{
a[++num]=str;
l[num]=strlen(str);
scanf("%s",str);
}
s="";
while (~scanf("%s",str)) s+=str;
len=s.length();
memset(g,false,sizeof(g));
g[0]=true;
for (k=0;k<=len;k++)
if (g[k])
{
ans=k;
for (i=1;i<=num;i++)
if (k+l[i]<=len)
{
for (j=0;j<l[i];j++)
if (s[k+j]!=a[i][j]) goto A;
g[k+l[i]]=true;
A: ;
}
}
printf("%d\n",ans);
return 0;
}