using
System;
using
System.Text;
class
GFG{
readonly
static
int
N = 400005;
readonly
static
int
mod = 1000000007;
static
int
[,] seg_tree =
new
int
[N, 26];
static
StringBuilder str;
static
void
build(
int
pos,
int
st,
int
en)
{
if
(st == en)
{
seg_tree[pos,str[st - 1] -
'a'
]++;
return
;
}
int
mid = st + en >> 1;
build(2 * pos, st, mid);
build(2 * pos + 1, mid + 1, en);
for
(
int
i = 0; i < 26; i++)
seg_tree[pos, i] = seg_tree[2 * pos + 1, i] +
seg_tree[2 * pos, i];
}
static
int
[] add_two_result(
int
[] v1,
int
[] v2)
{
int
[] added_vec =
new
int
[26];
for
(
int
i = 0; i < 26; i++)
added_vec[i] = v1[i] + v2[i];
return
added_vec;
}
static
int
[]
get
(
int
pos,
int
l,
int
r,
int
st,
int
en)
{
if
(l > en || r < st)
{
int
[] empty =
new
int
[26];
return
empty;
}
if
(st >= l && en <= r)
{
return
GetRow(seg_tree, pos);
}
int
mid = st + en >> 1;
int
[] v1 =
get
(2 * pos, l, r, st, mid);
int
[] v2 =
get
(2 * pos + 1, l, r, mid + 1, en);
return
add_two_result(v1, v2);
}
static
void
update(
int
pos,
int
indx,
int
st,
int
en,
char
pre,
char
cur)
{
if
(indx > en || indx < st)
return
;
seg_tree[pos,pre -
'a'
]--;
seg_tree[pos,cur -
'a'
]++;
if
(st != en)
{
int
mid = st + en >> 1;
update(2 * pos, indx, st, mid, pre, cur);
update(2 * pos + 1, indx, mid + 1,
en, pre, cur);
}
}
static
int
count_frequency(String s,
int
[] v)
{
int
ans = 1;
for
(
int
i = 0; i < s.Length; i++)
ans = (ans * v[s[i] -
'a'
]) % mod;
return
ans;
}
public
static
int
[] GetRow(
int
[,] matrix,
int
row)
{
var
rowLength = matrix.GetLength(1);
var
rowVector =
new
int
[rowLength];
for
(
var
i = 0; i < rowLength; i++)
rowVector[i] = matrix[row, i];
return
rowVector;
}
public
static
void
Main(String[] args)
{
int
n, ans;
int
[] v;
n = 15;
str =
new
StringBuilder(
"haardhhardrddrd"
);
build(1, 1, n);
String s =
"hard"
;
v =
get
(1, 1, 5, 1, n);
ans = count_frequency(s, v);
Console.WriteLine(ans);
update(1, 3, 1, n, str[2],
'x'
);
str[2] =
'x'
;
v =
get
(1, 1, 5, 1, n);
ans = count_frequency(s, v);
Console.WriteLine(ans);
}
}