题目链接[USACO2.3]最长前缀 Longest Prefix - 洛谷
题目被翻译的体无完肤,很难理解,简单来说就是一个字符串能够被分成若干份,份与份分别对应了一个给出的字符串,份与份之间连续,求这些份的长度;
用一个f[]数组,统计到pos这个位置时,遍历set全部元素,提取长度len,由于必须连续,往前找到长度len的位置,如果这个位置满足份的划分,那么当前位置借助这一字符串也可以完成,由于一个字符串不限次使用,如果知道这个位置可以分成若干份了,就直接终止循环即可。
细节是f[0]初始化成1,考察一些字符串函数
#include<iostream>
#include<set>
using namespace std;
set<string>s;
int f[200000+10];
int main()
{
string t;
while(cin>>t&&t!=".")
{
s.insert(t);
}
t=" ";
string ss=" ";
while(cin>>t)
{
ss+=t;
}
f[0]=1;
int ans=0;
for(int i=1;i<ss.length();i++)
{
int flag=0;
for(auto it:s)
{
int len=it.length();
if(i>=len)
{
if(f[i-len]&&ss.substr(i-len+1,len)==it)
{
flag=1;
break;
}
}
}
f[i]=flag;
if(f[i])
ans=max(ans,i);
}
cout<<ans;
return 0;
}