#include using namespace std; const int Limit=1e9+5; vector Pow2; int L,R,C,res=0; #define debug cout<<"OK"<<__LINE__<<"\n"; int rev(int n){ //n回目に出現する文字列Yはreversedか? if(*lower_bound(Pow2.begin(),Pow2.end(),n)==n)return 0; auto itr=upper_bound(Pow2.begin(),Pow2.end(),n); assert(Pow2.begin()>X>>Y; int xs=X.size(),ys=Y.size(); vector> NxtX(xs,vector(26,0)),PrevX(xs,vector(26,0));//Xのi文字目以降/以前にjはいくつ出現するか vector> NxtY(ys,vector(26,0)),PrevY(ys,vector(26,0));//Yのi文字目以降/以前にjはいくつ出現するか for(int i=0;i>c; C=(int)(c-'a'); int ln=(L-1)/(xs+ys)*2+(int)(xs<=(L-1)%(xs+ys)),rn=(R-1)/(xs+ys)*2+(int)(xs<=(R-1)%(xs+ys));//L,R文字目は何個目の文字列? int l=(L-1)%(xs+ys);if(xs<=l)l-=xs; int r=(R-1)%(xs+ys);if(xs<=r)r-=xs; if(ln==rn){ if(ln%2)printf("%d\n",NxtY[l][C]+PrevY[r][C]-NxtY[0][C]); else printf("%d\n",NxtX[l][C]+PrevX[r][C]-NxtX[0][C]); continue; } if(ln+1