码迷,mamicode.com
首页 > 其他好文 > 详细

poj2752 Seek the Name, Seek the Fame

时间:2018-08-19 16:15:04      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:void   sizeof   tac   mil   pre   mat   while   ring   ble   

传送门

题目大意

给你一个字符串,求既是它的前缀又是它的后缀的子串个数。

分析

这个题很明显是kmp的nxt数组的应用(为了显得我很厉害不妨假装它是border的应用),因为nxt[i]表示1~i-1的最长的既是前缀又是后缀的子串的长度,所以我们用nxt数组递归求解就行了。

实际挺好理解的,自己写写画画应该不难证明这样做的正确性。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
char s[400100];
int nxt[400100],n;
inline void getnxt(){
      int i=0,j=-1;
      while(i<n){
          if(j==-1||s[i]==s[j])i++,j++,nxt[i]=j;
          else j=nxt[j];
      }
      return;
}
inline void solve(int x){
      if(!nxt[x])return;
      solve(nxt[x]);
      printf("%d ",nxt[x]);
      return;
}
int main(){
      while(scanf("%s",s)!=EOF){
          memset(nxt,0,sizeof(nxt));
          nxt[0]=-1;
          n=strlen(s);
          getnxt();
          solve(n);
          printf("%d\n",n);
      }
      return 0;
}

poj2752 Seek the Name, Seek the Fame

标签:void   sizeof   tac   mil   pre   mat   while   ring   ble   

原文地址:https://www.cnblogs.com/yzxverygood/p/9501466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!