1368. 最长前缀
作者:互联网
状态表示:
\(f(i)\):前缀\(s[1 \sim i]\)能否由子串集合中的元素表示。
\(f(i)\)只有\(true\)和\(false\)两种取值。
状态转移:
对每个子串\(p[i]\),若\(s[i]\)大小为\(p[i]\)长度的后缀与\(p[i]\)匹配,则有如下转移:
\[f(i) \ |= f(i-p[i].size()) \]const int N=2e5+10;
bool f[N];
string a[210];
string s;
int n;
int main()
{
while(cin>>s, s[0] != '.')
a[n++]=s;
s = " ";
string line;
while(cin>>line) s += line;
f[0]=true;
int res=0;
for(int i=1;i<=s.size();i++)
for(int j=0;j<n;j++)
{
int t=a[j].size();
if(i >= t && s.substr(i-t+1,t) == a[j])
f[i] |= f[i-t];
if(f[i]) res=i;
}
cout<<res<<endl;
//system("pause");
return 0;
}
标签:string,int,res,cin,line,true,最长,1368,前缀 来源: https://www.cnblogs.com/fxh0707/p/14849776.html