版权声明:本文为博主原创文章,转载请联系博主(通常都会同意就是了) https://blog.csdn.net/cccccwb/article/details/86608532
题解:这题的关键在于判断重复,如果能快速判断重复就可以暴力通过。一开始考虑用map,以string为键值来记录,结果map效率太低,T了……然后考虑用哈希,结果被卡了,WA了……最后老老实实的建了一棵trie树……
顺便%一下用乘1e9+7自然溢出实现哈希通过的sqy老师……
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,k,cnt=1,ans;
bool f[30];
char s[1510],a[30];
struct node{
int son[26];
}t[3000000];
int main()
{
int sum,now;
gets(s);gets(a);n=strlen(s);
for(int i=1;i<=26;i++) f[i]=1-a[i-1]+48;
scanf("%d",&k);
for(int i=1;i<=n;i++)
{
sum=0;now=1;
for(int j=i;j<=n;j++)
{
sum+=f[s[j-1]-'a'+1];if(sum>k) break;
if(t[now].son[s[j-1]-'a']) now=t[now].son[s[j-1]-'a'];
else{ans++;t[now].son[s[j-1]-'a']=++cnt;now=cnt;}
}
}
printf("%d\n",ans);
return 0;
}