#include #include #include #include #include #include #define lson k<<1 #define rson k<<1|1 using namespace std; typedef long long ll; const ll MOD = 1000000007; const int N = 100005; char str[N]; struct Node { int l,r,shift; int num[26]; } tr[N<<2]; void Update(int k) { for(int i=0;i<26;i++) tr[k].num[i]=tr[lson].num[i]+tr[rson].num[i]; } void Build(int k,int l,int r) { tr[k].l=l,tr[k].r=r,tr[k].shift=0; if(l>1; Build(lson,l,m); Build(rson,m+1,r); Update(k); }else { memset(tr[k].num,0,sizeof(tr[k].num)); tr[k].num[str[l]-'a']++; } } int tmp_num[26]; void AddShift(int k,int shift) { tr[k].shift=(tr[k].shift+shift)%26; for(int i=0;i<26;i++) tmp_num[(i+shift)%26] = tr[k].num[i]; memcpy(tr[k].num,tmp_num,sizeof(tmp_num)); } void PushDown(int k) { if(tr[k].shift) { AddShift(lson,tr[k].shift); AddShift(rson,tr[k].shift); tr[k].shift=0; } } void Add(int k,int l,int r,int shift) { if(l==tr[k].l&&r==tr[k].r) { AddShift(k,shift); return; } PushDown(k); int mid = (tr[k].l+tr[k].r)>>1; if(r<=mid) Add(lson,l,r,shift); else if(l>mid) Add(rson,l,r,shift); else Add(lson,l,mid,shift),Add(rson,mid+1,r,shift); Update(k); } vector Sum(int k,int l,int r) { if(l==tr[k].l&&r==tr[k].r) { return vector(tr[k].num,tr[k].num+26); } PushDown(k); int mid=(tr[k].l+tr[k].r)>>1; if(r<=mid) return Sum(lson,l,r); else if(l>mid) return Sum(rson,mid+1,r); else { vector L = Sum(lson,l,mid); vector R = Sum(rson,mid+1,r); for(int i=0;i<26;i++) L[i]+=R[i]; return L; } } ll c[N]; void init() { c[0] = 1; for(int i=1;i res = Sum(1,l,r); memset(dp,0,sizeof(dp)); dp[26][0] = 1,dp[26][1] = 0; for(int i=25;i>=0;i--) { ll a = res[i]>0?c[res[i]-1]:1; dp[i][0] = (dp[i+1][0]*a)%MOD; dp[i][1] = (dp[i+1][0]*(res[i]>0?a:0)+dp[i+1][1]*a)%MOD; } printf("%lld\n",(dp[0][1]+dp[0][0] - 1 + MOD)%MOD); // printf("~~~ %lld %lld\n",dp[0][0],dp[0][1]); } } return 0; }