uva 1625

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
#include<cmath>
#include<queue>
#include<cctype>
#include<set>
#include<map>
#include<unordered_set>
using namespace std;

const int maxn = 5000 + 10, inf = 999999;
char p[maxn],q[maxn];
int sp[26], ep[26], sq[26], eq[26];
int c[2][maxn], d[2][maxn];
int n, m;

void initialization(){
    scanf("%s%s",p+1,q+1);
    n = strlen(p+1), m = strlen(q+1);
    for(int i = 1; i <= n; i++) p[i] -= 'A';
    for(int i = 1; i <= m; i++) q[i] -= 'A';
    fill(sp,sp+26,inf); fill(sq,sq+26,inf);
    fill(ep,ep+26,0);   fill(eq,eq+26,0);
    for(int i = 1; i <= n; i++) {
        if(sp[p[i]] == inf) sp[p[i]] = i;
        ep[p[i]] = i;
    }
    for(int i = 1; i <= m; i++) {
        if(sq[q[i]] == inf) sq[q[i]] = i;
        eq[q[i]] = i;
    }
}

int main(){
   int T;
   scanf("%d",&T);
   while(T--){
      initialization();

      int k = 1;
      memset(c, 0, sizeof(c));
      memset(d, 0, sizeof(d));

      for(int i = 0; i <= n; i++){
          for(int j = 0; j <= m; j++){
              if(!i&&!j) continue;
              int V1 = inf, V2 = inf;
              if(i) V1 = d[k^1][j] + c[k^1][j];
              if(j) V2 = d[k][j-1] + c[k][j-1];
              d[k][j] = min(V1, V2);
              if(i){
                 c[k][j] = c[k^1][j];
                 if(sp[p[i]] == i && sq[p[i]] > j)  c[k][j]++;
                 if(ep[p[i]] == i && eq[p[i]] <= j) c[k][j]--;
              }
              else{
                 c[k][j] = c[k][j-1];
                 if(sq[q[j]] == j && sp[q[j]] > i)  c[k][j]++;
                 if(eq[q[j]] == j && ep[q[j]] <= i) c[k][j]--;
              }
          }
          k ^= 1;
      }
      printf("%d\n",d[k^1][m]);
   }
   return 0;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/80036952