zoukankan      html  css  js  c++  java
  • Theme Section

    题目大意:给你一个串,从这个串里面找出一个前缀后缀中间相等的串的最大长度也就是 EAEBE,每个字母都代表一个串,E出现了三次,找出最长的那个E。

     
    分析:我们知道KMP里面保存的就是前缀和后缀的最大匹配度,如果在这匹配度中间再找一个串也让他等于这个匹配度,那么一定就是最大值,如果找不到就回朔next,其实还是挺暴力的做法,不过很意外时间用的并不多。
     
    代码如下:
    =====================================================================================================================
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    const int MAXN = 1e6+7;
    const int oo = 1e9+37;
    
    char s[MAXN];
    int Next[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];
        }
    }
    bool KMP(int start, int End)
    {
        int i = 0, j = start;
    
        while(i < start && j<End)
        {
            while(i==-1 || (s[i] == s[j] && i<start) )
                i++, j++;
    
            if(i == start)
                return true;
            i = Next[i];
        }
    
        return false;
    }
    
    int main()
    {
        int T;
    
        scanf("%d", &T);
    
        while(T--)
        {
            scanf("%s", s);
    
            int N = strlen(s);
            GetNext(N);
    
            int j = N;
    
            while(Next[j] > 0)
            {
                if(KMP(Next[j], N-Next[j]) == true)
                    break;
                j = Next[j];
            }
    
            printf("%d
    ", Next[j]);
        }
    
        return 0;
    }
  • 相关阅读:
    在普通类中调用service
    layui util 工具时间戳转换
    最大值
    药房管理
    线段树2
    线段树1
    Dijkstra
    最大值最小化
    图的M 着色问题
    取余运算
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4750214.html
Copyright © 2011-2022 走看看