zoukankan      html  css  js  c++  java
  • POJ_2752 Seek the Name, Seek the Fame 【KMP】

    一、题目

      POJ2752

    二、分析

      比较明显的KMP运用。

      但是这题不是只找一个,仔细看题后可以发现相当于是在找到最大的满足条件的后缀后,再在这个后缀里面找满足条件的后缀。

      可以不断的运用KMP得出答案,但是会超时。

      寻找优化,发现答案在处理过的next数组中,因为题目中的条件就是前缀和后缀交集,那么前缀的串肯定与后缀的串相同,那么我们只需要改变长度继续分析就可以了。

    三、AC代码

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 #include <set>
     5 using namespace std;
     6 const int maxn = 4e5 + 14;
     7 char s[maxn];
     8 int Next[maxn], Len;
     9 int ans[maxn], cnt;
    10 
    11 void get_next()
    12 {
    13     Next[0] = -1;
    14     int i = 0, j = -1;
    15     while(i <= Len)
    16     {
    17         if(j == -1 || s[i] == s[j])
    18         {
    19             i++;
    20             j++;
    21             Next[i] = j;
    22         }
    23         else
    24         {
    25             j = Next[j];
    26         }
    27     }
    28 }
    29 
    30 void solve()
    31 {
    32     get_next();
    33     cnt = 0;
    34     while(Len > 0)
    35     {
    36         ans[cnt++] = Len;
    37         Len = Next[Len];
    38     }
    39     cnt--;
    40     while(cnt > 0)
    41     {
    42         printf("%d ", ans[cnt--]);
    43     }
    44     printf("%d
    ", ans[0]);
    45 }
    46 
    47 int main()
    48 {
    49     //freopen("input.txt", "r", stdin);
    50     while(scanf("%s", s) != EOF)
    51     {
    52         Len = strlen(s);
    53         solve();
    54     }
    55     return 0;
    56 }
  • 相关阅读:
    关于LINUX文件与目录的问题说明
    poj1094拓扑排序
    poj3026(bfs+prim)最小生成树
    快速幂
    hdu4255筛素数+广搜
    网易2012校园招聘笔试题目
    网新恒天2011.9.21招聘会笔试题
    HDU3344(小广搜+小暴力
    HDU3348(贪心求硬币数
    HDU3345广搜 (P,E,T,#)
  • 原文地址:https://www.cnblogs.com/dybala21/p/11189975.html
Copyright © 2011-2022 走看看