# HackerEarth Fashion Line problem solution

In this HackerEarth Fashion Line problem solution, Rachel works at a big fashion organization. There is a big event coming up and she has to select dresses for an exhibition.

She has N dresses numbered 1 to N. There is a total of 62 types of dresses, each represented by a different alphanumeric character (a-z, A-Z, 0-9). The N dresses are represented by a string S of length N of alphanumeric characters. The ith character of S denotes the type of the ith dress. Rachel will select two integers, A and B such that 1 <= A <= B <= N and take the dresses numbered from A to B to the exhibition.

Out of the 62 dress types, K dress types are special. Find the number of values of A and B possible such that the total number of special dresses of any type selected is at least L and at most R.

## HackerEarth Fashion Line problem solution.

`#include<bits/stdc++.h>using namespace std;int getCharId(char ch){    if(ch>='a' && ch<='z')        return ch-'a';    else if(ch>='A' && ch<='Z')        return ch-'A'+26;    else if(ch>='0' && ch<='9')        return ch-'0'+52;    else        return -1;}int main(){    int T;    cin>>T;    assert(1<=T && T<=100);    while(T--)    {        char str,special;        int N,mark={0},K,i,L,R;        cin>>N>>K>>L>>R;        assert(1<=N  && N<=10000 && 1<=K && K<=62 && 0<=L && L<=N && 0<=R && R<=N && L<=R);        cin>>str>>special;        assert(strlen(str)==N);        assert(strlen(special)==K);        for(i=0;i<K;i++)        {                      mark[getCharId(special[i])]=1;        }        int next,next_c=0;        int len=strlen(str);        for(i=0;i<len;i++)        {            if(mark[getCharId(str[i])]==1)            {                next[next_c]=i;                next_c++;            }        }        long long ans=0,next_i=0;        for(i=0;i<len;i++)        {                        if(next_i+L-1>=next_c)                break;                            int till1=i;            if(L!=0)                till1=next[next_i+L-1];            int till2=len-1;            if(next_i+R<next_c)            {                till2=next[next_i+R]-1;            }                        if(till1<=till2)            {                ans+=(till2-till1+1);            }            if(mark[getCharId(str[i])]==1)                next_i++;        }        cout<<ans<<endl;    }    return 0;}`

### Second solution

`#include <bits/stdc++.h>using namespace std;bool chk;int dp;int main(){  int t,n,m,l,r;  string s,p;  int ans;  cin >> t;  assert(t>=1&&t<=100);  while ( t-- ) {    memset(chk, false, sizeof(chk));    cin >> n >> m >> l >> r;    assert(n>=1&&n<=10000);    assert(m>=1&&m<=62);    cin >> s >> p;    assert(s.size() == n);    assert(p.size() == m);    assert(l>=0&&l<=n);    assert(r>=0&&r<=n);    assert(l<=r);    for ( int i = 0; i < p.size(); i++ ) {      assert(p[i]>=0&&p[i]<=251);      chk[p[i]] = true;    }    dp = 0;    ans = 0;    for ( int i = 1; i <= n; i++ ) {      assert(s[i-1]>=0&&s[i-1]<=251);      dp[i] = dp[i-1] + chk[s[i-1]];    }    for ( int i = 1; i <= n; i++ ) {      int lf,rt,md,fs=-1,sc=n+1;      lf = i, rt = n, md = -1;      while ( lf <= rt ) {        md = (lf+rt)/2;        int val = dp[md] - dp[i-1];        if ( val >= l ) {          fs = md;          rt = md-1;        }        else if ( val < l ) lf = md+1;      }      if ( fs == -1 ) continue;      lf = i,rt = n, md = -1;      while ( lf <= rt ) {        md = (lf+rt)/2;        int val = dp[md] - dp[i-1];        if ( val > r ) {          sc = md;          rt = md-1;        }        else lf = md+1;      }      ans += sc-fs;    }    cout << ans << endl;  }  return 0;}`