HihoCoder1366 逆序单词(字典树)

逆序单词

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在英文中有很多逆序的单词,比如dog和god,evil和live等等。

现在给出一份包含N个单词的单词表,其中每个单词只出现一次,请你找出其中有多少对逆序单词。

输入

第1行:1个整数,N,表示单词数量。2≤N≤50,000。

第2..N+1行:每行1个单词,只包含小写字母,每个单词长度不超过16个字母。保证每个单词只出现一次,且不会出现回文单词(即一个单词倒序还是它自己,比如eye)。

输出

第1行:1个整数,表示单词表中逆序单词的对数。

样例输入
6
dog
live
hiho
evil
coder
god
样例输出
2

字典树秒。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000000;
int Next[maxn][26],ans,cnt;
bool End[maxn];
void insert(char c[])
{
    int Now=0,L=strlen(c);
    for(int i=0;i<L;i++){
        if(!Next[Now][c[i]-'a']) Next[Now][c[i]-'a']=++cnt;
        Now=Next[Now][c[i]-'a'];
    }
    End[Now]=1;
}
void query(char c[])
{
    int Now=0,L=strlen(c);
    for(int i=L-1;i>=0;i--){
        if(!Next[Now][c[i]-'a']) return ;
        Now=Next[Now][c[i]-'a'];
    }
    if(End[Now]) ans++;
}
int main()
{
    int i,j,n;
    char c[maxn];
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%s",c);
        query(c);
        insert(c);
    }
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/hua-dong/p/7860971.html