POJ 3852 String LD

简单题,第一次提交居然TLE了。然后以为暴力不行,所以写了个Trie树,汗...赛后和别人讨论发现是可以暴力的。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace  std;
int ans;
struct Trie
{
    int dep;
    int next[26];
    bool init(int d)
    {
        dep=d;
        memset(next,-1,sizeof(next));
    }
};
char *strrev(char *str)
{
    int ls,i;
    ls=strlen(str);
    char t;
    for (i=0; i<(ls+1)/2; i++)
    {
        t=str[i];
        str[i]=str[ls-i-1];
        str[ls-i-1]=t;
    }
    return str;
}
Trie tree[550000];
int lt;
void init()
{
    int i;
    lt=1;
    tree[0].init(0);
}
void insert(char *word)
{
    int t,i,val,lw;
    t=0;
    lw=strlen(word);
    i=0;
    while (word[i] != '\0')
    {
        val=word[i]-'a';
        if (tree[t].next[val] == -1)
        {
            tree[t].next[val]=lt;
            tree[lt].init(tree[t].dep+1);
            //printf("%d %d %d %d %c\n",t,val,lt,tree[lt].tag,word[i]);
            t=lt;
            lt++;
        }
        else
        {
            t=tree[t].next[val];
            ans=ans>(lw-tree[t].dep)?(lw-tree[t].dep):ans;
        }
        i++;
    }
}
int main()
{
    int n,i,j,k;
    char str[110][110];
    char s[13];
    while (true)
    {
        scanf("%d",&n);
        ans=9999;
        init();
        if (n == 0)
            break;
        for (i=0; i<n; i++)
        {
            scanf("%s",str[i]);
            strcpy(str[i],strrev(str[i]));
            j=strlen(str[i]);
            ans=ans>j?j:ans;
        }
        for (i=0; i<n; i++)
            insert(str[i]);
        printf("%d\n",ans-1);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值