题目链接:点击打开链接
题意:求一组字符串中有多少字符串是和另一个字符串的逆序是一致的
思路:使用在线的算法,每次读入一个字符串的时候,先进行查询(正序),随后进行插入(逆序)
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
node *nxt[26];
int flag;
node()//构造函数
{
for(int i=0;i<26;i++)
{
nxt[i]=NULL;
}
flag=0;
}
};
node * root;
void init()//初始化根节点
{
root=new node();
}
void ins (char *s)//插入(逆序)
{
int len=strlen(s);
node *now=root;//指向根节点
for(int i=len-1;i>=0;i--)
{
int to=s[i]-'a';
if(now->nxt[to]==NULL)now->nxt[to]=new node();
now=now->nxt[to];//now指向新生成的结点
}
now->flag++;//最后一个叶节点做标记 意思是这个字符串在这个结点结束
}
int fid(char *s)//查询(正序)
{
int len=strlen(s);
node *now=root;//指向根节点
for(int i=0;i<len;i++)
{
int to=s[i]-'a';
if(now->nxt[to]==NULL)return 0;
now=now->nxt[to];//now指向新生成的结点
}
return now->flag;
}
char s[20];
int main()
{
int ans;
int n;
init();
scanf("%d",&n);
ans=0;
for(int i=0;i<n;i++)
{
scanf("%s",s);
ans+=fid(s);
ins(s);
}
printf("%d\n",ans);
return 0;
}