#include <iostream> #include <vector> #include <string> #include <utility> #include <algorithm> int dp[3003][3003]; int solve(std::string& s, std::string& t) { int n = s.length(); int m = t.length(); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = std::max(dp[i-1][j], dp[i][j-1]); } } return dp[n][m]; } int main() { std::ios::sync_with_stdio(false); int n, m, q; std::cin >> n >> m >> q; std::string s, t; std::cin >> s >> t; for(int i = 0; i <= n; i++) dp[i][0] = 0; for(int j = 0; j <= m; j++) dp[0][j] = 0; for(int a = 0; a < q; a++) { int i, j, k, l; std::cin >> i >> j >> k >> l; std::string s_sub = s.substr(i-1, j-i+1); std::string t_sub = t.substr(k-1, l-k+1); std::cout << solve(s_sub, t_sub) << "\n"; } std::cout << std::flush; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <iostream> #include <vector> #include <string> #include <utility> #include <algorithm> int dp[3003][3003]; int solve(std::string& s, std::string& t) { int n = s.length(); int m = t.length(); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = std::max(dp[i-1][j], dp[i][j-1]); } } return dp[n][m]; } int main() { std::ios::sync_with_stdio(false); int n, m, q; std::cin >> n >> m >> q; std::string s, t; std::cin >> s >> t; for(int i = 0; i <= n; i++) dp[i][0] = 0; for(int j = 0; j <= m; j++) dp[0][j] = 0; for(int a = 0; a < q; a++) { int i, j, k, l; std::cin >> i >> j >> k >> l; std::string s_sub = s.substr(i-1, j-i+1); std::string t_sub = t.substr(k-1, l-k+1); std::cout << solve(s_sub, t_sub) << "\n"; } std::cout << std::flush; return 0; } |