您的位置:首页 > 其它

文章标题

2017-10-15 12:10 176 查看
洛谷 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
[1] == '.') break;
len
= strlen(p
+ 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: