现在的位置: 首页 > 综合 > 正文

hihoCoder 1107 Shortest Proper Prefix 微软苏州校招笔试 1月17日

2018年04月25日 ⁄ 综合 ⁄ 共 1450字 ⁄ 字号 评论关闭

字典树,需要用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;
}

抱歉!评论已关闭.