給定兩個字串\(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 時間複...