题目
这个题可以用dp和字典树做
//dp版
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include<vector>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int INF=0x3f3f3f3f;
const int Max=2e5+100;
char a[250][250];
char s[Max];
char ss[Max];
int len[250];
int dp[Max]; //存字符串长度为i时,满足条件的最大长度
int check(int aa,int bb)
{
int x=strlen(a[aa]);
for(int i=0; i<x; i++)
if(a[aa][i]!=s[bb+i])
return 0;
return 1;
}
int main()
{
int i=1;
while(scanf("%s",a[i++]))
{
if(a[i-1][0]=='.')
break;
len[i-1]=strlen(a[i-1]);
}
int x=i-2,ans=0;
while(~scanf("%s",ss))//注意题中说有多行输入
{
strcat(s+1,ss);
//printf("%s",s+1);
}
int len_s=strlen(s+1);
for(int i=1; i<=len_s; i++)
{
for(int j=1; j<=x; j++) //遍历每个字符
{
if(i>=len[j]&&check(j,i-len[j]+1)&&(i-len[j]==0||dp[i-len[j]])) //判断该字符是否是长度为i的字符串的后缀,且字符串的长度小于等于i,如果i-len[j]!=0且dp[i-len[j]]==0,表示不合题意
{
dp[i]=max(dp[i],dp[i-len[j]]+len[j]);
}
}
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
return 0;
}