• 一本通 Seek the Name, Seek the Fame(KMP)


    题意:给你一个字符串s,输出该字符串的所有的前后缀长度

    思路:利用next数组,next[i]是子串长为i的最大公共前后缀,

    所以 next[next[i]] 意味着 在最大公共前后缀 的子串里再去寻找最大公共前后缀子串

    
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <queue>
    using namespace std;
    const int maxn=1e6+10;
    int nextt[maxn],l1;
    char s[maxn];
    int ans[maxn];
    void getnext()//纯粹的建立next数组 
    {
    	int j=-1,i=0;
    	nextt[0]=-1;
    	while(i<l1)
    	{
    		if (j==-1||s[i]==s[j])
    		{
    			i++,j++;
    			nextt[i]=j;
    			//printf("<%d %d
    ",i,j);
    		}
    		else
    		{
    			//printf("%d %d>
    ",j,nextt[j]);
    			j=nextt[j];
    		}
    	}
    }
    int main()
    {
    	int i,j,n;
    	while(~scanf("%s",s))
    	{
    		l1=strlen(s);
    		getnext();
    
    		int k=0;
    		i=l1;
    		//凡是next[i]!=0的,都是模式串的前缀和后缀相同的字符数
    		while (nextt[i]!=-1) 
    		{
    			ans[k++]=i;
    			i=nextt[i];//
    		}
    		for (i=k-1; i>=0; i--)
    			printf("%d ",ans[i]);
    		
    		printf("
    ");
    	}
    	return 0;
    }
    

    `

  • 相关阅读:
    person
    汽车.
    矩形
    设计模式
    汽车
    三角形
    银行
    西游记
    面向对象
    随机生成4位验证码,输入验证码与生成的比较,最多输入5次
  • 原文地址:https://www.cnblogs.com/shidianshixuan/p/13922478.html
Copyright © 2020-2023  润新知