zoukankan      html  css  js  c++  java
  • Seek the Name, Seek the Fame

    题目大意:小猫是非常有名气的,所以很多父母都来找它给孩子取名字,因为找的人比较多,小猫为了摆脱这个无聊的工作,于是它发明了一种取名字的办法,它把孩子父母的名字合在一起,然后从这个名字里面找一个前缀,并且这个前缀也得是后缀,然后用它当孩子的名字,比如父亲的名字是:ala,母亲的名字是la, 那么孩子的名字就可以是“a”,“ala”,“alala”, 现在想知道孩子的名字可以多长?

     
    分析:最长的那个一定是字符串的长度,第二长的就是前缀后缀的最大匹配度 next[N],第三长的就是next[next[N]],一直递归下去,直到等于0。
    下面是AC代码
    =========================================================================================
    #include<stdio.h>
    #include<string.h>
    
    const int MAXN = 1e6+7;
    const int oo = 1e9+7;
    
    char s[MAXN];
    int next[MAXN], ans[MAXN];
    
    void GetNext(int N)
    {
        int i=0, j=-1;
        next[0] = -1;
    
        while(i < N)
        {
            if(j==-1 || s[i]==s[j])
                next[++i] = ++j;
            else
                j = next[j];
        }
    }
    
    int main()
    {
    
        while(scanf("%s", s) != EOF)
        {
            int N = strlen(s), k=0;
    
            GetNext(N);
    
            ans[k++] = N;
    
            while(next[N] != 0)
            {
                ans[k++] = next[N];
                N = next[N];
            }
    
            for(int i=k-1; i>=0; i--)
            {
                printf("%d%c", ans[i], i ?' ':'
    ');
            }
        }
    
        return 0;
    }
  • 相关阅读:
    我们的CPU遭到攻击[LOJ558]
    历史[ZJOI2018]
    字符串[LOJ6517]
    奥运公交[LOJ3255]
    BLO-Blockade[POI2008]
    压力[BJOI2013]
    Earthquake[USACO01OPEN]
    暴力写挂[CTSC2018]
    极简教程:数据结构与算法(二)
    DllRegisterServer的调用失败的问题解决方法
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4730987.html
Copyright © 2011-2022 走看看