/* -*- coding: utf-8 -*- * * 874.cc: No.874 正規表現間距離 - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 2000; const int INF = 1 << 30; /* typedef */ typedef pair pcc; /* global variables */ char sa[MAX_N + 4], sb[MAX_N + 4]; pcc as[MAX_N + 1], bs[MAX_N + 1]; int dp[MAX_N + 1][MAX_N + 1]; /* subroutines */ int parse(char s[], pcc v[]) { int n = 0; for (int i = 0; s[i]; i++) { if (s[i] == '?') v[n - 1].second = '?'; else if (s[i] == '*') v[n - 1].second = '*'; else v[n++] = pcc(s[i], '.'); } return n; } void printpcc(int n, pcc v[]) { for (int i = 0; i < n; i++) { putchar(v[i].first); putchar(v[i].second); } putchar('\n'); } inline void setmin(int &a, int b) { if (a > b) a = b; } /* main */ int main() { scanf("%s%s", sa, sb); int an = parse(sa, as); int bn = parse(sb, bs); //printpcc(an, as); printpcc(bn, bs); for (int i = 0; i <= an; i++) fill(dp[i], dp[i] + bn + 1, INF); dp[0][0] = 0; for (int i = 0; i <= an; i++) { char &ac = as[i].first, &am = as[i].second; for (int j = 0; j <= bn; j++) { char &bc = bs[j].first, &bm = bs[j].second; if (i < an && j < bn && ac == bc) { setmin(dp[i + 1][j + 1], dp[i][j]); if (am == '*') setmin(dp[i][j + 1], dp[i][j]); if (bm == '*') setmin(dp[i + 1][j], dp[i][j]); } if (i < an) setmin(dp[i + 1][j], dp[i][j] + ((am == '.') ? 1 : 0)); if (j < bn) setmin(dp[i][j + 1], dp[i][j] + ((bm == '.') ? 1 : 0)); } } printf("%d\n", dp[an][bn]); return 0; }