逆序单词
时间限制: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; }