P1470 [USACO2.3]最长前缀 Longest Prefix-DP与字符串

题目链接[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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qinsanma and Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值