Advertisement
Morass

Untitled

Oct 30th, 2017
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF int(1e9+1)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef pair<ll,ll> pll;
  12. typedef vector<int> vi;
  13. typedef pair<int,int> ii;
  14. typedef vector<ii> vii;
  15. #define IN(n) int n;scanf("%d",&n);
  16. #define FOR(i, m, n) for (int i(m); i < n; i++)
  17. #define F(n) FOR(i,0,n)
  18. #define FF(n) FOR(j,0,n)
  19. #define FT(m, n) FOR(k, m, n)
  20. #define aa first
  21. #define bb second
  22. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  23. #define MOD (1000000007)
  24. #define IV (MOD/2+1ll)
  25. #define MX (1<<17)
  26. #define SQ (222)
  27. char s[MX],c,d;
  28. int N,Q,a,b,A[MX],O[MX],P[MX]={1},I[MX]={1};
  29. struct MOQ{
  30.     int b,e,i;
  31.     bool operator<(const MOQ&r)const{return b/SQ^r.b/SQ?b/SQ<r.b/SQ:e<r.e;}
  32. };
  33. struct MO{
  34.     MOQ T[MX];
  35.     int C[MX],L,b,e;
  36.     void CLR(){L=0;}//clr not tested
  37.     void QY(int b,int e){T[L]={min(b,e),max(b,e),L};++L;}
  38.     void GO(int*O){
  39.         CL(C,0),st();
  40.         sort(T,T+L),b=T[0].b-1,e=T[0].b-1;
  41.         F(L){
  42.             while(b>=T[i].b)add(b--,0);
  43.             while(e<T[i].e)add(++e,1);
  44.             while(b+1<T[i].b)del(++b,0);
  45.             while(e>T[i].e)del(e--,1);
  46.             O[T[i].i]=ans();
  47.         }
  48.     }
  49.     //MO
  50.     int H,U,u,S,G;
  51.     void add(int w,bool x){
  52.         ++S;
  53.         G+=(c==d)&&s[w]==c;
  54.         if(x){
  55.             if(s[w]==d)H+=U,H%=MOD,u+=P[S-1],u%=MOD;
  56.             U=U*2%MOD;
  57.             if(s[w]==c)++U;
  58.         }else{
  59.             if(s[w]==c)H+=u,H%=MOD,U+=P[S-1],U%=MOD;
  60.             u=u*2%MOD;
  61.             if(s[w]==d)++u;
  62.         }
  63. //        printf("ADD (%c)[%d] => (%d|%d) [%d]\n",s[w],x,U,u,H);
  64.     }  
  65.     void del(int w,bool x){
  66.         --S;
  67.         G-=(c==d)&&s[w]==c;
  68.         if(x){
  69.             if(s[w]==c)U=(U+MOD-1)%MOD;
  70.             U=U*IV%MOD;
  71.             if(s[w]==d)H=H-U+MOD,H%=MOD,u+=MOD-P[S],u%=MOD;
  72.         }else{
  73.             if(s[w]==d)u=(u+MOD-1)%MOD;
  74.             u=u*IV%MOD;
  75.             if(s[w]==c)H=(H-u+MOD)%MOD,U+=MOD-P[S],U%=MOD;
  76.         }
  77. //        printf("DEL (%c)[%d] => (%d|%d) [%d]\n",s[w],x,U,u,H);
  78.     }
  79.     int ans(){
  80. //        D(H)
  81.         return (H+G)%MOD;
  82.     }
  83.     void st(){H=U=u=S=G=0;}
  84. }T;
  85. int main(void){
  86.     FT(1,MX)P[k]=P[k-1]*2%MOD,I[k]=I[k-1]*IV%MOD;
  87.     scanf("%d%s %c %c%d",&N,s,&c,&d,&Q),T.CLR();
  88.     F(Q)scanf("%d%d",&a,&b),T.QY(a,b);
  89.     T.GO(O);
  90.     F(Q)printf("%d\n",O[i]);
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement