zoukankan      html  css  js  c++  java
  • [Tjoi2013][BZOJ3172] 单词

    3172: [Tjoi2013]单词

    Time Limit: 10 Sec  Memory Limit: 512 MB
    Submit: 1832  Solved: 845
    [Submit][Status][Discuss]

    Description

    某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

    Input

    第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6

    Output

    输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。

    Sample Input

    3
    a
    aa
    aaa

    Sample Output

    6
    3
    1

    HINT

     

    Source

    昨天刚学了AC自动机……今天练练手……

    求出fail树后给结点打一个标记,输出每个串终点子树的标记个数和。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<vector>
    #include<map>
    using namespace std;
    char ch[1000005];
    int n,cnt=1,pos[222],next[1000005][26],sum[1000005],fail[1000005],q[1000005];
    void insert(int &pos)
    {
        int now=1;
        scanf("%s",ch);
        int len=strlen(ch);
        for (int i=0;i<len;i++)
        {
            if (next[now][ch[i]-'a']==-1) next[now][ch[i]-'a']=++cnt;
            now=next[now][ch[i]-'a'];
            sum[now]++;
        }        
        pos=now;
    }
    void make_fail()
    {
        int head=0,tail=1;
        q[1]=1; fail[1]=0;
        while (head<tail)
        {
            int now=q[++head];
            for (int i=0;i<26;i++)
            {
                int v=next[now][i];
                if (v==-1) continue;
                int k=fail[now];
                while (next[k][i]==-1) k=fail[k];
                fail[v]=next[k][i];
                q[++tail]=v;
            }
        }
        for (int i=tail;i>=1;i--) sum[fail[q[i]]]+=sum[q[i]];
    }
    int main()
    {
        memset(next,0xff,sizeof(next));
        for (int i=0;i<26;i++) next[0][i]=1;
        scanf("%d",&n);
        for (int i=1;i<=n;i++) insert(pos[i]);
        make_fail();
        for (int i=1;i<=n;i++) printf("%d
    ",sum[pos[i]]);
        return 0;
    }
        
  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/ws-fqk/p/4650254.html
Copyright © 2011-2022 走看看