其他分享
首页 > 其他分享> > 1368. 最长前缀

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