字典树,需要用fre[u][v]记录出现频率。最后遍历字典树如果该节点出现频率no more than 5,ans++并返回。否则遍历其不为空的子节点。
代码中的两种dfs都可以,WA了好久最后是因为sz没有初始化为1。==
#include<iostream>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<vector>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#include<ctype.h>
#include<map>
#include<time.h>
#include<bitset>
using namespace std;
//hiho 1107
int N;
const int maxnode=2000010;
const int sigmasize=26;
int sz;
int ch[maxnode][sigmasize];
int fre[maxnode][sigmasize];
int f[maxnode];
int val[maxnode];
int ans;
int idx(char c)
{
return c-'a';
}
void Insert(char *s,int v)
{
int u=0,n=strlen(s);
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
fre[u][c]++;
u=ch[u][c];
f[u]++;
}
val[u]=v;
}
void dfs2(int u)//u is the index of node
{
if(u==0)
{
return;
}
if(f[u]>0&&f[u]<=5)
{
// cout<<u<<" "<<i<<" "<<ch[u][i]<<endl;
ans++;
return;
}
for(int i=0;i<26;i++)
{
if(ch[u][i]>0)
{
dfs2(ch[u][i]);
}
}
}
void dfs(int u,int v)
{
if(ch[u][v]==0)
{
return;
}
if(fre[u][v]>0&&fre[u][v]<=5)
{
ans++;
return;
}
else if(fre[u][v]>5)
{
for(int i=0;i<26;i++)
{
dfs(ch[u][v],i);
}
}
}
int main()
{
freopen("input.txt","r",stdin);
//freopen("data.txt","r",stdin);
//freopen("out1.txt","w",stdout);
scanf("%d",&N);
char c[2000000];
memset(ch,0,sizeof(ch));
memset(fre,0,sizeof(fre));
memset(val,0,sizeof(val));
sz=1;//got a WA wothout it
for(int i=0;i<N;i++)
{
scanf("%s",&c);
Insert(c,1);
}
ans=0;
for(int i=0;i<26;i++)
{
dfs2(ch[0][i]); //this is also accepted
//dfs(0,i);
}
printf("%d\n",ans);
return 0;
}