#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; }
uva 1625
猜你喜欢
转载自blog.csdn.net/a874288174/article/details/80036952
今日推荐
周排行