Solo TLE con writing

Buongiorno stavo cercando di risolvere il problema Writing delle IOI del 2006 ma il mio codice riceve 55/100 con molti TLE e con un solo errore nel secondo subtask, se qualcuno avesse qualche consiglio da darmi mi farebbe un gran piacere, grazie per il vostro tempo vi lascio qui di seguito il mio codice!

#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
	long long int g;
	long long int N;
	cin>>g>>N;
	multiset<char>W;
	for(int i=0;i<g;i++){
		char c;
		cin>>c;
		W.insert(c);
	}
	string S;
	cin>>S;
	long long int ris=0;
	int i=0;
	while(i<N-g){
		if(W.find(S[i])!=W.end()){
			int j=i+1;
			while(j<i+g && W.find(S[j])!=W.end()){
				j++;
			}
			if(j==i+g){
				ris++;
				i++;
			}
			else{
				i=j+1;
			}
		}
		else{
			i++;
		}
	}
	cout<<ris;
}

Salveh, sono un pochino confuso, se non sbaglio il tuo programma non controlla che la parola analizzata sia un anagramma di W ma controlla solo se ha le stesse lettere (senza la molteplicità). Inoltre nel while principale i dovrebbe essere <=N-g altrimenti ti perdi l’ultimo pezzo.
In particolare all’esempio

1 1
a
a

Risponde con 0 e, una volta corretto questo, all’esempio

3 3
cca
caa

Risponde con 1 (ma dovrebbe essere 0).

Ah si in effetti avevo gia notato questo caso ma penso di aver anche gia capito come risolverlo grazie comunque per l’aiuto

Ok, comunque l’usare un multiset non ha molto senso, i caratteri diversi sono veramente pochi, riesci a trovare un modo per utilizzare un array?