文章标题

来源:互联网 发布:中信国安历史交易数据 编辑:程序博客网 时间:2024/05/18 04:36

洛谷 1470最长前缀 Longest Prefix

有一个字符串S,求他的从s[1]开始的可以被匹配的最长长度。

a[i][k] == j表示第i个字符开始的连续j个字符可以被匹配(即p中有对应的元素)
if( !a[i][k] && !dp[i - a[i][k]]) dp[i] = 1;
注意读入。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;char p[205][11];char s[200005] = {},ss[2002];int dp[200005],len[205],flag,l = 1,last = 1;int main(){    int n = 0;    while(~scanf("%s",p[++n] + 1))    {        if(p[n][1] == '.') break;        len[n] = strlen(p[n] + 1);    }    while(~scanf("\n%s",ss))    {        int ll = strlen(ss);        for(int i = 0; i <= ll; ++i)        {            s[i + l] = ss[i];        }        l += ll;    }    dp[0] = 1;    for(int i = 1; i <= l; ++i)        for(int j = 1; j < n; ++j)        {            flag = 1;            for(int k = 1; k <= len[j] && i - len[j] + k >= 1; ++k)                if(s[i - len[j] + k] != p[j][k])                 {                    flag = 0;                    break;                }            if(flag && dp[i - len[j]])             {                for(int k = 1; k <= len[j]; ++k)    dp[i - k + 1] = 1;                break;            }        }    for(int i = 1; i <= l; ++i)        if(!dp[i])        {            printf("%d",i - 1);            break;        }    return 0;}
原创粉丝点击