Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <cstring>
- using namespace std;
- const int inf = 1e9;
- typedef long long int64;
- int64 n;
- char S[1000010]; int s, k;
- vector <int> L[300];
- int main()
- {
- #ifdef _PLATINA
- freopen("input.txt", "r", stdin);
- #endif
- scanf("%I64d %s%d", &n, S, &k);
- s = strlen(S);
- int64 row, a, b; char letter;
- int i;
- for(i = 0; i < s; i++){
- L[ S[i] ].push_back(i);
- }
- int from, to; int64 ans;
- for(i = 0; i < k; i++){
- scanf("%I64d %c", &row, &letter);
- a = row;
- b = row - 1;
- if(a % 2 == 1){
- swap(a, b);
- }
- a = ((a / 2) % s) * 1ll * (b % s);
- a %= s;
- ans = (row / s) * L[letter].size();
- if(row % s > 0){
- from = a;
- to = row % s + a - 1; to %= s;
- if(from == to + 1){
- ans += L[letter].size();
- }else if(from <= to){
- to = upper_bound(L[letter].begin(), L[letter].end(), to) - L[letter].begin();
- from = lower_bound(L[letter].begin(), L[letter].end(), from) - L[letter].begin();
- ans += to - from;
- }else{
- to++; from--;
- to = lower_bound(L[letter].begin(), L[letter].end(), to) - L[letter].begin();
- from = upper_bound(L[letter].begin(), L[letter].end(), from) - L[letter].begin();
- ans += L[letter].size() - (from - to);
- }
- }
- printf("%lld\n", ans);
- }
- return 0;
- }
- /*
- 6
- JANJETINA
- 5
- 1 J
- 1 A
- 6 N
- 6 I
- 5 E
- 5
- A
- 5
- 1 A
- 2 A
- 3 A
- 4 A
- 5 B
- 3
- AB
- 3
- 2 A
- 2 B
- 3 B
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement