Submission #251468

#TimeUsernameProblemLanguageResultExecution timeMemory
2514682qbingxuanLollipop (POI11_liz)C++14
100 / 100
558 ms31504 KiB
#include <iostream> #include <algorithm> using namespace std; const int N = 1000025; int n, q, v[N], sum[N]; int Z[N], lb[N*2]; signed main() { ios_base::sync_with_stdio(0), cin.tie(0); string s; cin >> n >> q >> s; for(int i = 0; i < n; i++) v[i] = (s[i]=='T' ? 2 : 1); for(int i = 0; i < n; i++) sum[i+1] = sum[i] + v[i]; for(int i = 1, j = 0; i <= n*2; i++) { while(j < n && sum[j] < i) ++j; lb[i] = j; } for(int i = 1, j = 0, r = 0; i < n; i++) { Z[i] = max(0, min(r-i, Z[i-j])); while(i+Z[i] < n && v[Z[i]] == v[i+Z[i]]) ++Z[i]; if(i+Z[i] > r) j = i, r = i+Z[i]; } Z[0] = n; while(q--) { int k; cin >> k; int x = lb[k]; if(sum[x] == k) cout << 1 << ' ' << x << '\n'; else { // sum[x] == k+1 int L = Z[x]; // v[0:Z[x]-1] = v[x:x+Z[x]-1] // v[Z[x]] != v[x+Z[x]] int R = x+Z[x]; /* debug(L, R); */ if(v[L] == 1) --R; ++L; if(R >= n || sum[R+1] - sum[L] != k) cout << "NIE\n"; else cout << L+1 << ' ' << R+1 << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...