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

 

posted @ 2016-02-27 20:54  shuguangzw  阅读(326)  评论(0编辑  收藏  举报