제출 #1001608

#제출 시각아이디문제언어결과실행 시간메모리
1001608vjudge1Dabbeh (INOI20_dabbeh)C++17
25 / 100
2001 ms302220 KiB
#include <bits/stdc++.h> using namespace std; namespace hsg { mt19937_64 rng(chrono::steady_clock().now().time_since_epoch().count()); const long long mod = (long long)1e18+9; long long R=rng()%(mod); struct PolyHash { vector<long long> pref,pw; int n; PolyHash(string s) { n = s.size(); pref.resize(n+1); pw.resize(n+1); pw[0]=1; for(int i = 1;i<=n;i++) { pref[i] = ((__int128_t)pref[i-1]*R)%mod; pref[i]+=s[i-1]; pref[i]%=mod; pw[i] = ((__int128_t)pw[i-1]*R)%mod; } } long long get(int l, int r) { long long hs=(pref[r]-((__int128_t)pref[l-1]*pw[r-l+1])%mod + mod)%mod; return hs; } }; }; const int LL = 3e5+10; const int LG = 20; int up[LL][LG]; int nxt[LL]; bool cmp(const string& A, const string &B) { return A.size() < B.size(); }; int get(int l, int r) { int at = l; int ans=1; while(nxt[at] < r) { if(at == up[at][0]) { return -1; } at = up[at][0]; ans++; } return ans; } int main () { cin.tie(0)->sync_with_stdio(0); int n, m; cin >> n >> m; string s[n]; for(int i =0;i<n;i++) { cin >> s[i]; } sort(s, s+n, cmp); string S; cin >> S; int L = S.size(); vector<pair<int,int>> inv; memset(nxt, -1, sizeof nxt); hsg::PolyHash hs(S); map<long long, bool> mp[L+1]; for(int i = 0;i<n;i++) { hsg::PolyHash hss(s[i]); for(int j = 0 ;j<min(L, (int)s[i].size());j++) { mp[j+1][hss.get(1, j+1)]=1; } } for(int i = 0;i<L;i++) { nxt[i]=i; int lo = 1, hi = L-i; while(lo <= hi) { int mid = (lo+hi)/2; if(mp[mid][hs.get(i+1, i+mid)]) { nxt[i] = i+mid; lo = mid+1; } else { hi=mid-1; } } } if(L <= 500) { { vector<int> v[L+1]; for(int i= 0;i<L;i++) { v[nxt[i]].push_back(i); } vector<int> stk; for(int i = 0;i<L;i++) { while(stk.size() and nxt[stk.back()] <= nxt[i]) { stk.pop_back(); } stk.push_back(i); for(int j:v[i]){ int idx = (*lower_bound(stk.begin(), stk.end(), j)); up[j][0] = idx; } } } } while(m--) { int l, r; cin >> l >> r; int res = get(l, r); cout << res << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...