Codeforces 271D Good Substrings 暴力+Trie

来源:互联网 发布:sql语句高级教程 编辑:程序博客网 时间:2024/05/16 12:18

点击打开链接

题意:string s长度<=1500,字母表a中1代表bad,问s中有多少个不同的substring(s[l]~s[r])满足bad字符不超过k个? 
枚举substring 开头 直到右端点R非法 map标记重复,O(n^2logn) TLE了
在标记重复上进行优化,用Trie保存所有的substring,枚举开头,遍历Trie,若该结点没访问过,标记后ans++即可 O(n^2)

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e3+20;string s,a;int b[N],k;int ch[N*N][30],val[N*N];//trieint root,num;void insert(int l,int r){int u=0;for(int i=l;i<r;i++){int id=s[i]-'a';if(!ch[u][id])ch[u][id]=++num;u=ch[u][id];val[u]=1;}val[u]=1;//}int query(int l,int r){int res=0,cnt=0;int u=0;for(int i=l;i<r;i++){int id=s[i]-'a';u=ch[u][id];if(a[id]=='0')cnt++;if(cnt<=k)res+=val[u],val[u]=0;//val[u]清零 elsereturn res;}return res;}int main(){ while(cin>>s>>a>>k) { int ans=0; memset(ch,0,sizeof(ch));num=0; int len=s.length(); for(int i=0;s[i];i++)//把所有的substring插入到Trie  insert(i,len); for(int i=0;s[i];i++)//O(n^2)ans+=query(i,len);cout<<ans<<endl;}return 0;}



0 0