Codeforces 633 C Spy Syndrome 2 字典树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 633 C Spy Syndrome 2 字典树相关的知识,希望对你有一定的参考价值。

题意:还是比较好理解

分析:把每个单词反转,建字典树,然后暴力匹配加密串

注:然后我就是特别不理解,上面那种能过,而且时间很短,但是我想反之亦然啊

我一开始写的是,把加密串进行反转,然后单词正着建字典树,然后就TLE了,反着写就能过

真是百思不得解,然后我猜测可能是单词数目比较少

技术分享
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=1000000+5;
char s[10005];
char str[100005][1005];
int len[100005];
int trie[N][26],mk[N];
int ans[10005],tot,cnt,m,n;
void add(int x)
{
    int now=0;
    for(int i=len[x]-1; i>=0; --i)
    {
        char tmp=str[x][i];
        if(tmp<a||tmp>z)
            tmp+=a-A;
        int p=tmp-a;
        if(!trie[now][p])
            trie[now][p]=++cnt;
        now=trie[now][p];
    }
    mk[now]=x;
}
void solve(int pos)
{
    if(pos==n)
    {
        for(int i=1; i<tot; ++i)
            printf("%s ",str[ans[i]]);
        printf("%s\n",str[ans[tot]]);
       exit(0);
    }
    int now=0;
    for(int i=pos+1; i<=n; ++i)
    {
        int p=s[i]-a;
        now=trie[now][p];
        if(!now)break;
        if(mk[now])
        {
            ans[++tot]=mk[now];
            solve(pos+len[mk[now]]);
            --tot;
        }
    }
}
int main()
{
    scanf("%d%s",&n,s+1);
//    for(int i=1; i<=n/2; ++i)
//        swap(s[i],s[n-i+1]);
    scanf("%d",&m);
    for(int i=1; i<=m; ++i)
    {
        scanf("%s",str[i]);
        len[i]=strlen(str[i]);
        add(i);
    }
    solve(0);
    return 0;
}
View Code

 

以上是关于Codeforces 633 C Spy Syndrome 2 字典树的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 633C Spy Syndrome 2 Trie树+DFS

CF633C Spy Syndrome 2

Codeforces Round #633 div2 A~C

Codeforces Round #633 (Div. 2)(A, B, C)

CodeForces 633B A Trivial Problem

Codeforces Round #633 (Div. 2)