# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
251472 | 2qbingxuan | Lollipop (POI11_liz) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
const int N = 1000025;
inline int max(int a, int b){return a>b ? a : b;}
inline int min(int a, int b){return a<b ? a : b;}
int n, q, v[N], sum[N];
int Z[N], lb[N*2];
char s[N];
signed main() {
scanf("%d%d%s", &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) printf("%d %d\n", 1, x);
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) puts("NIE");
else printf("%d %d\n", L+1, R+1);
}
}
}