#include <bits/stdc++.h>
using namespace std;
typedef long long lld;
typedef pair<int,int> pii;
typedef pair<lld,lld> pll;
typedef vector<int> vint;
#define ff first
#define ss second
#define mp make_pair
#define pb push_back
constexpr int M=4096;
int dp[M][M];
//bitset <4> p[4096][4096]; // 0-> (i-1), 1-> (j-1), 2->(i-1,j-1)+1
bitset<M> o[M];
int n, m, T, wyn;
int p1, p2, q1, q2;
char a[M], b[M];
queue <pii> q;
pii x;
void cleer(){
while(!q.empty()) q.pop();
}
void add(int x, int y){
if(x<p1 or y<p2) return;
if(!o[x][y]){
o[x][y]=1;
q.push(mp(x,y));
}
}
int main(){
scanf("%d%d%d",&n,&m,&T);
scanf(" %s",a+1);
scanf(" %s",b+1);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1;
}
}
while(T--){
scanf("%d%d%d%d",&p1,&q1,&p2,&q2);
--p1; --p2;
add(q1,q2);
wyn=dp[q1][q2];
while(!q.empty()){
x=q.front();
q.pop();
if(x.ff==p1 or x.ss==p2){
wyn=min(wyn,dp[x.ff][x.ss]);
//printf("biorę wynik z %d %d\n",x.ff,x.ss);
}else{
if(dp[x.ff][x.ss]==dp[x.ff-1][x.ss]) add(x.ff-1,x.ss);
if(dp[x.ff][x.ss]==dp[x.ff][x.ss-1]) add(x.ff,x.ss-1);
if(a[x.ff]==b[x.ss]) add(x.ff-1,x.ss-1);
}
}
printf("%d\n",dp[q1][q2]-wyn);
for(int i=p1;i<=q1;++i) o[i].reset();
}
return 0;
}
/*
5 6 7
abaab
babbaa
1 5 1 6
1 3 2 4
2 5 2 5
1 4 2 5
2 5 3 6
2 2 5 6
3 4 2 2
*/
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <bits/stdc++.h> using namespace std; typedef long long lld; typedef pair<int,int> pii; typedef pair<lld,lld> pll; typedef vector<int> vint; #define ff first #define ss second #define mp make_pair #define pb push_back constexpr int M=4096; int dp[M][M]; //bitset <4> p[4096][4096]; // 0-> (i-1), 1-> (j-1), 2->(i-1,j-1)+1 bitset<M> o[M]; int n, m, T, wyn; int p1, p2, q1, q2; char a[M], b[M]; queue <pii> q; pii x; void cleer(){ while(!q.empty()) q.pop(); } void add(int x, int y){ if(x<p1 or y<p2) return; if(!o[x][y]){ o[x][y]=1; q.push(mp(x,y)); } } int main(){ scanf("%d%d%d",&n,&m,&T); scanf(" %s",a+1); scanf(" %s",b+1); for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ dp[i][j]=max(dp[i-1][j],dp[i][j-1]); if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; } } while(T--){ scanf("%d%d%d%d",&p1,&q1,&p2,&q2); --p1; --p2; add(q1,q2); wyn=dp[q1][q2]; while(!q.empty()){ x=q.front(); q.pop(); if(x.ff==p1 or x.ss==p2){ wyn=min(wyn,dp[x.ff][x.ss]); //printf("biorę wynik z %d %d\n",x.ff,x.ss); }else{ if(dp[x.ff][x.ss]==dp[x.ff-1][x.ss]) add(x.ff-1,x.ss); if(dp[x.ff][x.ss]==dp[x.ff][x.ss-1]) add(x.ff,x.ss-1); if(a[x.ff]==b[x.ss]) add(x.ff-1,x.ss-1); } } printf("%d\n",dp[q1][q2]-wyn); for(int i=p1;i<=q1;++i) o[i].reset(); } return 0; } /* 5 6 7 abaab babbaa 1 5 1 6 1 3 2 4 2 5 2 5 1 4 2 5 2 5 3 6 2 2 5 6 3 4 2 2 */ |
English