dp C 公共子串行

2022-06-12 22:00:09 字數 749 閱讀 8076

給定兩個字串\(s1,s2\),求它們的\(lcs\)

滿足\(|s1|\leq 10^6,|s2|\leq 10^3\)

考場寫了\(o(|s1|*|s2|)\)成功tle,

考慮突破口為\(|s2|\)不夠大,考慮轉為判定,

設\(dp[i][j]\)表示原來存在最小的\(k\)使得\(f[k][i]\geq j\),不存在為\(n+1\)

那麼\(dp[i][j]=\min\\),

然後二分\(dp[m][ans]\)即可,\(nxt\)陣列要預處理,其實就是子串行自動機

轉為判定是真的妙

#include #include #define rr register

using namespace std;

const int n = 1011, m = 1000011;

char s1[m], s2[n];

int dp[n][n], nxt[m][26], ls[26], n, m;

inline signed min(int a, int b)

signed main()

for (rr int i = 1; i <= m; ++i)

for (rr int j = 1; j <= i; ++j)

rr int l = 0, r = m;

while (l < r)

return !printf("%d", l);

}

最長公共子串行 線性DP(C )

acwing 897.最長公共子串行 給定兩個長度分別為n和m的字串a和b,求既是a的子串行又是b的子串行的字串長度最長是多少。輸入格式 第一行包含兩個整數n和m。第二行包含乙個長度為n的字串,表示字串a。第三行包含乙個長度為m的字串,表示字串b。字串均由小寫字母構成。輸出格式 輸出乙個整數,表示最...

公共子串行

03 公共子串行 描述我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行,當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串...

公共子串行

最長公共子串行問題 給定2個字串,求其最長公共子串。如abcde和dbada的最長公共字串為bd。動態規劃 dp i j 表示a串前i個和b串前j個的最長公共子串的長度。則若a i b j dp i j dp i 1 j 1 1 否則 dp i j max dp i 1 j dp i j 1 時間複...