//#pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #include "bits/stdc++.h" using namespace std; #define PB push_back #define LL long long #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORD(i,a,b) for (int i = (a); i >= (b); i--) #define REP(i,n) FOR(i,0,(int)(n)-1) #define st first #define nd second #define ALL(x) (x).begin(), (x).end() #define SZ(x) ((int)(x).size()) #define VI vector<int> #define PII pair<int,int> #define LD long double template<class C> void mini(C& a4, C b4) { a4 = min(a4, b4); } template<class C> void maxi(C& a4, C b4) { a4 = max(a4, b4); } template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";} template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) { while(*sdbg!=',')cerr<<*sdbg++; cerr<<"="<<h<<","; _dbg(sdbg+1, a...); } template<class T> ostream &operator<<(ostream &os, vector<T> V){ os<<"[";for(auto vv:V)os<<vv<<",";return os<<"]"; } template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) { return os << "(" << P.st << "," << P.nd << ")"; } using ull = unsigned long long; inline auto get_carry(ull &x, ull y){ ull z = x; x -= y; return z < x; } #define get(A, x) ((A[(x) >> 6] >> ((x) & 63)) & 1) #define set(A, x) (A[(x) >> 6] |= 1llu << ((x) & 63)) int lcs(const char * A, const char * B, int n, int m) { int sz = (m >> 6) + 1; // 64bit vector<ull> S[32]; for (int i = 0; i < 32; ++i) S[i].resize(sz, 0); for (int i = 0; i < m; ++i) set(S[B[i]], i); vector<ull> R(sz, 0); for (int i = 0; i < m; ++i) if (A[0] == B[i]) { set(R, i); break; } for (int i = 1; i < n; ++i) { ull shl_carry = 1, sub_carry = 0; for (int j = 0; j < sz; ++j) { ull x = S[A[i]][j] | R[j]; ull u = (R[j] << 1) | shl_carry; shl_carry = R[j] >> 63; ull v = x; sub_carry = get_carry(v, sub_carry); sub_carry += get_carry(v, u); R[j] = x & (x ^ v); } R[m >> 6] &= (1llu << (m & 63)) - 1llu; } int ret = 0; for (int i = 0; i < m; ++i) if (get(R, i)) ++ret; return ret; } #undef set #undef get #ifdef LOCAL #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #else #define debug(...) (__VA_ARGS__) #define cerr if(0)cout #endif struct Solution{ int n,m,q; vector<VI> queries; vector<vector<bool>> eq; Solution(){ cin >> n >> m >> q; eq.resize(n, vector<bool>(m)); string s1, s2; cin >> s1 >> s2; for(char & c : s1){ c -= 'a'; c++; } for(char & c : s2){ c -= 'a'; c++; } queries.resize(q, VI(4)); REP(i, q){ int a, b,c,d; cin >> a >> b >> c >> d; a--; b--; c--; d--; int ans; ans = lcs(s1.c_str() + a, s2.c_str() + c, b - a + 1, d - c + 1); cout << ans << "\n"; } } }; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(11); cerr << fixed << setprecision(6); Solution(); }
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | //#pragma comment(linker, "/stack:200000000") #pragma GCC optimize("Ofast") #include "bits/stdc++.h" using namespace std; #define PB push_back #define LL long long #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORD(i,a,b) for (int i = (a); i >= (b); i--) #define REP(i,n) FOR(i,0,(int)(n)-1) #define st first #define nd second #define ALL(x) (x).begin(), (x).end() #define SZ(x) ((int)(x).size()) #define VI vector<int> #define PII pair<int,int> #define LD long double template<class C> void mini(C& a4, C b4) { a4 = min(a4, b4); } template<class C> void maxi(C& a4, C b4) { a4 = max(a4, b4); } template<class TH> void _dbg(const char *sdbg, TH h){cerr<<sdbg<<"="<<h<<"\n";} template<class TH, class... TA> void _dbg(const char *sdbg, TH h, TA... a) { while(*sdbg!=',')cerr<<*sdbg++; cerr<<"="<<h<<","; _dbg(sdbg+1, a...); } template<class T> ostream &operator<<(ostream &os, vector<T> V){ os<<"[";for(auto vv:V)os<<vv<<",";return os<<"]"; } template<class L, class R> ostream &operator<<(ostream &os, pair<L,R> P) { return os << "(" << P.st << "," << P.nd << ")"; } using ull = unsigned long long; inline auto get_carry(ull &x, ull y){ ull z = x; x -= y; return z < x; } #define get(A, x) ((A[(x) >> 6] >> ((x) & 63)) & 1) #define set(A, x) (A[(x) >> 6] |= 1llu << ((x) & 63)) int lcs(const char * A, const char * B, int n, int m) { int sz = (m >> 6) + 1; // 64bit vector<ull> S[32]; for (int i = 0; i < 32; ++i) S[i].resize(sz, 0); for (int i = 0; i < m; ++i) set(S[B[i]], i); vector<ull> R(sz, 0); for (int i = 0; i < m; ++i) if (A[0] == B[i]) { set(R, i); break; } for (int i = 1; i < n; ++i) { ull shl_carry = 1, sub_carry = 0; for (int j = 0; j < sz; ++j) { ull x = S[A[i]][j] | R[j]; ull u = (R[j] << 1) | shl_carry; shl_carry = R[j] >> 63; ull v = x; sub_carry = get_carry(v, sub_carry); sub_carry += get_carry(v, u); R[j] = x & (x ^ v); } R[m >> 6] &= (1llu << (m & 63)) - 1llu; } int ret = 0; for (int i = 0; i < m; ++i) if (get(R, i)) ++ret; return ret; } #undef set #undef get #ifdef LOCAL #define debug(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #else #define debug(...) (__VA_ARGS__) #define cerr if(0)cout #endif struct Solution{ int n,m,q; vector<VI> queries; vector<vector<bool>> eq; Solution(){ cin >> n >> m >> q; eq.resize(n, vector<bool>(m)); string s1, s2; cin >> s1 >> s2; for(char & c : s1){ c -= 'a'; c++; } for(char & c : s2){ c -= 'a'; c++; } queries.resize(q, VI(4)); REP(i, q){ int a, b,c,d; cin >> a >> b >> c >> d; a--; b--; c--; d--; int ans; ans = lcs(s1.c_str() + a, s2.c_str() + c, b - a + 1, d - c + 1); cout << ans << "\n"; } } }; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout << fixed << setprecision(11); cerr << fixed << setprecision(6); Solution(); } |