题意:
解法:
O(n^2)枚举子串,如果合法则将hash值标记,
最后答案为不同hash值的数量.
code:
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int maxm=2e3+5;
const int p=1331;
char s[maxm];
char f[maxm];
ull base[maxm];
ull h[maxm];
int n,k;
ull ask(int l,int r){
return h[r]-base[r-l+1]*h[l-1];
}
void solve(){
cin>>(s+1);
cin>>(f+1);
cin>>k;
n=strlen(s+1);
base[0]=1;
for(int i=1;i<maxm;i++)base[i]=base[i-1]*p;
for(int i=1;i<=n;i++)h[i]=h[i-1]*p+s[i];
map<ull,int>mp;
for(int i=1;i<=n;i++){
for(int j=i,sum=0;j<=n;j++){
if(f[s[j]-'a'+1]=='0')sum++;
if(sum>k)break;
mp[ask(i,j)]=1;
}
}
cout<<mp.size()<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
solve();
return 0;
}