这道题是需要用动态规划来写,主要就是判断集合中的一个元素是否与序列s从当前i开始的一部分字符串相等。代码如下。
#include<bits/stdc++.h>
using namespace std;
char dic[205][15],s[200005];
int dp[200005];
int main (){
char a[80];
freopen ("prefix.in","r",stdin);
freopen ("prefix.out","w",stdout);
int cnt=0,i=0,j=0,k=0,ok=1,ans=0;
while(dic[cnt++][0]!='.'){
cin>>dic[cnt];
}
cnt--;
while (cin>>a){
strcat(s,a);
}
for (i=0;s[i];i++){
if (i&&!dp[i-1]){
continue;
}
for (j=1;j<cnt;j++){
k=0,ok=1;
for (;dic[j][k];k++){
if (dic[j][k]!=s[i+k]){
ok=0;
break;
}
}
if (ok){
dp[i+k-1]=1;
ans=max(ans,i+k);
}
}
}
cout<<ans<<endl;
return 0;
}