// Witold Milewski
// PA 2025
#include <bits/stdc++.h>
// #define int long long
#define i128 __int128_t
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
#define FOR(i, a, b) for(int i=a; i<=b; ++i)
#define FORB(i, b, a) for(int i=b; i>=a; --i)
#define sz(A) (int)(A.size())
#define ll long long
#define eb emplace_back
#define pb push_back
#define pi pair<int, int>
#define f first
#define s second
#define rs resize
#define V vector
const int p=998244353, p1=11, m1=1e9+7, maxn=5e4+7;
int n, q;
V<int> A, pot1;
void solve() {
gp_hash_table<int, int> licz;
FOR(m, 1, (1<<n)-1) {
int h1=0;
int ktora=1;
FOR(i, 0, n-1) {
if((m&(1<<i))==0) continue;
h1=(0ll+h1+(1ll*pot1[ktora]*A[i+1]))%m1;
++ktora;
}
licz[h1]++;
}
int odp=0;
for(auto &[str, ile] : licz) if(ile>=2) odp=(odp+1)%p;
cout << odp << '\n';
}
signed main() {
cin.tie(0) -> ios_base::sync_with_stdio(0);
pot1.rs(maxn);
pot1[0]=1;
FOR(i, 1, maxn-1) pot1[i]=(pot1[i-1]*p1)%m1;
cin >> n >> q;
string str;
cin >> str;
A.rs(n+1);
FOR(i, 1, n) A[i]=str[i-1]-'a'+1;
solve();
int idx;
char lit;
while(q--) {
cin >> idx >> lit;
A[idx]=lit-'a'+1;
solve();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | // Witold Milewski // PA 2025 #include <bits/stdc++.h> // #define int long long #define i128 __int128_t #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; #define FOR(i, a, b) for(int i=a; i<=b; ++i) #define FORB(i, b, a) for(int i=b; i>=a; --i) #define sz(A) (int)(A.size()) #define ll long long #define eb emplace_back #define pb push_back #define pi pair<int, int> #define f first #define s second #define rs resize #define V vector const int p=998244353, p1=11, m1=1e9+7, maxn=5e4+7; int n, q; V<int> A, pot1; void solve() { gp_hash_table<int, int> licz; FOR(m, 1, (1<<n)-1) { int h1=0; int ktora=1; FOR(i, 0, n-1) { if((m&(1<<i))==0) continue; h1=(0ll+h1+(1ll*pot1[ktora]*A[i+1]))%m1; ++ktora; } licz[h1]++; } int odp=0; for(auto &[str, ile] : licz) if(ile>=2) odp=(odp+1)%p; cout << odp << '\n'; } signed main() { cin.tie(0) -> ios_base::sync_with_stdio(0); pot1.rs(maxn); pot1[0]=1; FOR(i, 1, maxn-1) pot1[i]=(pot1[i-1]*p1)%m1; cin >> n >> q; string str; cin >> str; A.rs(n+1); FOR(i, 1, n) A[i]=str[i-1]-'a'+1; solve(); int idx; char lit; while(q--) { cin >> idx >> lit; A[idx]=lit-'a'+1; solve(); } } |
English