CF 271D Good Substrings(trie树)

除了图论以外,随便做一下数据结构,感觉挺不错的

分析题目:每个子串都是,如果能插入到字典树,就答案加1,思想比较简单,但是要注意的是,想问题要清楚,对于这道题,有一个k在限制,所以不必把所有的子串都插入,用字典树的另一个目的在于能够除重,是插入一个子串,就加1,而不是已有的子串也加1。另外,由于是子串,它不必一个一个子串完整的插入,比如说:asdfg这个字符串,as是子串,asd也是子串,这时候如果as已经被插入了,那么直接就遍历到d了把插入进去,不用从头再插一遍asd这个整个的子串。如果没明白,那就看下面的代码吧!总之要灵活

代码:

//by Molly
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 5000000;
int ch[N][26], k;
char f[30], s[2000];

int main()
{
    cin >> s >> f >> k;
    memset( ch, 0, sizeof(ch) );
    int sz = 1;
    long long ans = 0;
    for ( int i = 0; i < strlen(s); ++i ) {
        int u = 0, cnt = 0, c;
        for ( int j = i; j < strlen(s); ++j ) {
            c = s[j] - 'a';
            if ( f[c] == '0' ) {
                if ( ++cnt > k ) break;
            }
            if ( !ch[u][c] ) {
                ch[u][c] = sz++;
                ans++;
            }
            u = ch[u][c];
        }
    }
    cout << ans << endl;
}


你可能感兴趣的:(CF 271D Good Substrings(trie树))