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


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[10001],special[10001];
        int N,mark[62]={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[100001],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[252];
int dp[10002];

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] = 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;
}