【Coel.解题报告】【博客园初体验~】洛谷P2922 [USACO08DEC]Secret Message G

在洛谷以外的地方开了一个博客,以后活动大多就在这里进行了,洛谷可能用来写游记之类的玩意。

P2922 [USACO08DEC]Secret Message G 题目传送门在此

一道字典树的入门级题目但是还是蓝题,考察的都是基本的操作,不需要多谈。

那为什么标题还要叫作解题报告

#include<cstring>
#include<cstdio>
#define maxn 500050
#define maxc 10005
int m,n,cnt=1,trie[maxn][2],vis[maxn],sum[maxn];
bool s[maxc];//字符串都是01串,所以用bool变量节省空间
inline int read()
{
    char ch=getchar();
    int s=0;
    while(ch<'0'||ch>'9')
        ch=getchar();
    while(ch>='0'&&ch<='9')
    {
        s=s*10+ch-'0';
        ch=getchar();
    }
    return s;
}
inline void insert(bool *s,int len)//基本建树过程
{
    int u=1;
    for(register int i=1;i<=len;i++)
    {
        bool c=s[i];
        if(trie[u][c]==-1)trie[u][c]=++cnt;
        u=trie[u][c];
        sum[u]++;
    }
    vis[u]++;
}
inline int search(bool *s,int len)
{
    int u=1,ans=0;
    for(register int i=1;i<=len;i++)
    {
        bool c=s[i];
        if(trie[u][c]==-1)return ans;
        u=trie[u][c];
        ans+=vis[u];//存下符合要求的字符串个数
    }
    return ans-vis[u]+sum[u];
}
int main()
{
    memset(trie,-1,sizeof(trie));//考虑到要存储字符串个数,把字典树初始化为-1
    m=read(),n=read();
    for(register int i=1;i<=m;i++)
    {
        int len=read();
        for(register int j=1;j<=len;j++)
            s[j]=read();
        insert(s,len);
    }
    for(register int i=1;i<=n;i++)
    {
        int len=read();
        for(register int j=1;j<=len;j++)
            s[j]=read();
        printf("%d\n",search(s,len));
    }
    return 0;
}

 

上一篇:[HAOI2010]计数题解


下一篇:树上差分