洛谷 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;
}