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
| #include<bits/stdc++.h> using namespace std; #define endl '\n' #define FL(a,b,c) for(int a=(b),a##end=(c);a<=a##end;++a) #define FR(a,b,c) for(int a=(b),a##end=(c);a>=a##end;--a) #define lowbit(x) ((x)&-(x)) #define eb emplace_back #define sz(x) (int)((x).size()) #define vt vector #define fr first #define se second bool IOS=(cin.tie(0)->sync_with_stdio(0),0);
#ifdef LOCAL bool IOS1=(freopen(LOCAL".in", "r", stdin),1); bool IOS2=(freopen(LOCAL".out", "w", stdout),1); #endif #define mmt(x, y) memset(x, y, sizeof x) #define PII pair<int, int> #define max(a, b)({auto f7r=(a);auto j3h=(b);f7r<j3h?j3h:f7r;}) #define cmax(a, b)({auto j3h=(b);(j3h>a)&&(a=j3h);}) #define min(a, b)({auto f7r=(a);auto j3h=(b);f7r>j3h?j3h:f7r;}) #define cmin(a, b)({auto j3h=(b);(j3h<a)&&(a=j3h);}) constexpr int N = 1e6 + 10, M = 5e6 + 10; char a[M], b[M]; int len, cnt[M], ch[M][27], tot, g[M], fail[M]; inline void insert(){ int p = 0; FL(i, 1, len) (!ch[p][g[i]]) && (ch[p][g[i]] = ++tot), p = ch[p][g[i]]; cnt[p]++; } inline void build(){ queue<int>q; FL(i, 0, 26)if(ch[0][i])q.emplace(ch[0][i]); while(!q.empty()){ int x = q.front(), z;q.pop(); FL(i, 0, 26) if(!(z = ch[x][i]))ch[x][i] = ch[fail[x]][i]; else fail[z] = ch[fail[x]][i], q.emplace(z), cnt[z] += cnt[fail[z]]; } } int query(){ int p = 0, ans = 0; FL(i, 1, len)p = ch[p][g[i]], ans += cnt[p]; return ans; } int32_t main(){ int n, q; cin >> n >> q; FL(i, 1, n){ cin >> a + 1 >> b + 1, len = 0; int n = strlen(a + 1), l = n + 1, r; FL(i, 1, n)if(a[i] != b[i])r = i, cmin(l, i); if(len = 0, l > n)continue; FL(i, 1, l - 1)g[++len] = a[i] - 'a';g[++len] = 26; FL(i, l, r)g[++len] = a[i] - 'a', g[++len] = b[i] - 'a';g[++len] = 26; FL(i, r + 1, n)g[++len] = a[i] - 'a';insert(); } build(); while(q--){ cin >> a + 1 >> b + 1, len = 0; if(strlen(a + 1) != strlen(b + 1)){cout << 0 << endl;continue;} int n = strlen(a + 1), l = n + 1, r; FL(i, 1, n)if(a[i] != b[i])r = i, cmin(l, i); FL(i, 1, l - 1)g[++len] = a[i] - 'a';g[++len] = 26; FL(i, l, r)g[++len] = a[i] - 'a', g[++len] = b[i] - 'a';g[++len] = 26; FL(i, r + 1, n)g[++len] = a[i] - 'a'; cout << query() << endl; } return 0; }
|