CodeForces 271D Good Substrings

版权声明:本文为博主原创文章,转载请联系博主(通常都会同意就是了) 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;
}

猜你喜欢

转载自blog.csdn.net/cccccwb/article/details/86608532