Codeforces Round #166 (Div. 2)D. Good Substrings(利用数组模拟trie树)

题目传送门
题目大意
给你一个只包含小写字母的字符串s.
问你在这个字符串中有多少个不同的子串.
且要求这些子串中不得出现超过k个的特殊字母.
*子串s1和子串s2不同,当且仅当s1!=s2,即s1和s2完全不同.
*子串指的是字符串中截取出来的连续的一段.
输入格式
第一行,一个长度不超过1500仅包含小写字母的字符串s.
第二行,包含一个长度为26的01字符串,如果字符串的第i(0<=i< length(s))个位置为’0’,说明’a’+i为特殊字母,否则’a’+i不是特殊字母.
第三行,包含一个整数k(0<=k<=|s|).
输出格式
只有一个整数,表示符合要求的不同子串的个数
样例
样例输入1
ababab
01000000000000000000000000
1
样例输出1
5
样例输入2
acbacbacaa
00000000000000000000000000
2
样例输出2
8
样例解释
对于第一个样例,符合要求的子串分别为:“a”, “ab”, “b”, “ba”, “bab”.

题目分析
主要是用数组模拟trie树,详见代码:

#include<iostream>
using namespace std;
const int maxn=1500*1500;
string s,letter;
int k,tot=1,root=1;
int trie[maxn][26];
int main()
{
    cin>>s;
    cin>>letter;
    cin>>k;
    for(int i=0;i<s.size();i++)
    {
        int cur=root;
        int cnt=0;
        for(int j=i;j<s.size();j++)
        {
            if(letter[s[j]-'a']=='0') cnt++;
            if(cnt>k) break;
            if(trie[cur][s[j]-'a']==0) trie[cur][s[j]-'a']=++tot;
            cur=trie[cur][s[j]-'a'];
        }

    }
    cout<<tot-1<<endl;
}

    原文作者:Trie树
    原文地址: https://blog.csdn.net/intmainhhh/article/details/82929117
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞