文章标题
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;
注意读入。
有一个字符串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; }