https://www.luogu.com.cn/problem/P1470
思路:表示前綴已經全部匹配,否則表示該位置不可行。那麼思路就是掃一遍,如果,就從此處開始和集合中的元素暴力匹配,如果匹配成功就更新對應的數組。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pr pair<int,int>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
vector<string> vec;
string s,ss;
int dp[maxn];
inline bool check(int pos,const string &str)
{
int siz1=s.size(),siz2=str.size();
if(siz1-pos<siz2)
return 0;
for(int i=0,j=pos;i<siz2;i++,j++)
if(s[j]!=str[i])
return 0;
return 1;
}
int main()
{
while(cin>>ss&&ss[0]!='.')
vec.push_back(ss);
s="";
while(cin>>ss)
s+=ss;
int len=s.size();
int num=vec.size();
for(int i=0;i<num;i++)
if(check(0,vec[i]))
dp[vec[i].size()]=1;
for(int i=0;i<len;i++)
{
if(dp[i])
{
for(int j=0;j<num;j++)
if(check(i,vec[j]))
dp[i+vec[j].size()]=1;
}
}
int ans=0;
for(int i=len;i>=0;i--)
{
if(dp[i])
{
ans=i;
break;
}
}
printf("%d\n",ans);
return 0;
}