[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher E-Period G - Seek the Name, Seek the Fame

题目

思路

  • 看到前后缀就想到kmp了
  • 要求的是字符串的所有前后缀相同的长度
  • KMP的next求解的时候,如果P[k]!=P[j],就令k=NEXT[k],这样找到的k之前的字符串仍然是与后缀相等的前缀(但是变短了)。
  • 最后得到的next数组,next[k]储存的是满足条件的最长前缀的长度,那么满足条件的前缀只需要遍历k = next[k],直到长度为0就行了。

AC代码

#include<iostream>
#include<stack>
using namespace std;
const int MAXN=10000002;

string P;
string T;

int NEXT[MAXN];
int plen,tlen;
void getNEXT(){
    NEXT[0] = -1;
    int k = -1 ;
    int j = 0 ;
    while(j<plen){
        if(k==-1||P[k]==P[j]){
            NEXT[++j] = ++k;
        }else{
            k = NEXT[k];
        }
    }
    
}

int main(){
    
    ios::sync_with_stdio(false);
    while(cin>>P){      
        plen=P.length();
        getNEXT();
        
//      for(int i = 0 ; i<=plen;i++){
//          cout<<" "<<NEXT[i];
//      }
        stack<int> S;
        int k = plen;
        S.push(plen);
        while(NEXT[k] != 0){
            k = NEXT[k];
            S.push(k);
    //      cout<<"k"<<k<<"\n";
        }
        int size = S.size();
        while(size--){
            if(size!=0)
                cout<<S.top()<<" ";
            else cout<<S.top();
            S.pop();
        }
        cout<<"\n";
//      P="";
    }
    
    return 0;
} 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 字符串匹配KMP算法详解 1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有...
    张晨辉Allen阅读 2,630评论 0 3
  • 数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章、这篇文章、还有这篇他们写得非常...
    sunhaiyu阅读 1,872评论 1 21
  • 数据结构 第8讲 KMP算法 讲这个算法之前,我们首先了解几个概念: 串:又称字符串,是由零个或多个字符组成的有限...
    rainchxy阅读 1,464评论 0 3
  • 文章大纲:1.KMP算法概念2.KMP算法中最核心的next[] 数组是如何生成的3.使用KMP算法 匹配字符串 ...
    柠檬乌冬面阅读 865评论 0 3
  • 少有人走的路 Day 4@因心木灬 自律的原动力———爱。 爱是长期的和渐进的过程。爱是自我完善,意味着心智不断成...
    小冷睡了阅读 190评论 0 0

友情链接更多精彩内容