#include <cstdio> #include <vector> #include "message.h" using namespace std; char s1[100002]; char s2[100002]; pair<int, int> v[2][100001]; int main() { if(MyNodeId()) return 0; int n, m; scanf("%d %d %s %s", &n, &m, s1 + 1, s2 + 1); for(int i = 1; i <= m; i++) v[0][i] = make_pair(i, 0); bool i = false; for(int k = 1; k <= n; k++) { i = !i; v[i][0] = make_pair(k, 0); for(int j = 1; j <= m; j++) { v[i][j] = min(v[!i][j], v[i][j-1]); v[i][j].first++; if(s1[k] == s2[j]) v[i][j] = min(v[i][j], v[!i][j-1]); else v[i][j] = min(v[i][j], make_pair(v[!i][j-1].first + 1, v[!i][j-1].second + (s1[k] < s2[j]))); } } printf("%d %d\n", v[i][m].first, v[i][m].second); }
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 | #include <cstdio> #include <vector> #include "message.h" using namespace std; char s1[100002]; char s2[100002]; pair<int, int> v[2][100001]; int main() { if(MyNodeId()) return 0; int n, m; scanf("%d %d %s %s", &n, &m, s1 + 1, s2 + 1); for(int i = 1; i <= m; i++) v[0][i] = make_pair(i, 0); bool i = false; for(int k = 1; k <= n; k++) { i = !i; v[i][0] = make_pair(k, 0); for(int j = 1; j <= m; j++) { v[i][j] = min(v[!i][j], v[i][j-1]); v[i][j].first++; if(s1[k] == s2[j]) v[i][j] = min(v[i][j], v[!i][j-1]); else v[i][j] = min(v[i][j], make_pair(v[!i][j-1].first + 1, v[!i][j-1].second + (s1[k] < s2[j]))); } } printf("%d %d\n", v[i][m].first, v[i][m].second); } |