zoukankan      html  css  js  c++  java
  • 编程珠玑---读书笔记---使用后缀数组查找最长重复子串

    后缀数组是一个字符指针数组,数组中指针所指的对象包含了字符串的每一个后缀,因此成为后缀数组。

    看代码:

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    #include <sstream>
    #include <cstdlib>
    #include <fstream>
    #include <queue>
    #include <ctime>
    #include <set>
    using namespace std;
    #define MAXN 5000000
    char c[MAXN],*a[MAXN];
    bool cmp(char *p,char *q)    //对后缀数组进行排序所用的谓词函数 
    {
    	return strcmp(p,q)<0;
    }
    int comlen(char *p,char *q)   //计算最长公共子串的长度 
    {
    	int i=0;
    	while(*p && (*p++==*q++))i++;
    	return i;
    }
    int main()
    {
    	char ch;
    	int n=0;
    	while((ch=getchar())!=EOF)
    	{
    		c[n]=ch;
    		a[n]=&c[n];
    		n++;
    	}
    	c[n]='';
    	sort(a,a+n,cmp);
    	//for(int i=0;i<n;i++)cout<<a[i]<<endl;
    	int maxlen=-1,maxi=0;
    	for(int i=0;i<n-1;i++)
    	{
    		if(comlen(a[i],a[i+1])>maxlen){
    			maxlen=comlen(a[i],a[i+1]);
    			maxi=i;
    		}
    	}
    	printf("%.*s
    ",maxlen,a[maxi]);  //输出前maxlen个字符 
    	return 0;
    }


    样例输入:ask not what your country can do for you,but what you can do for your country.

    输出:        “ can do for you”

    由于排序的存在,算法需要O(n logn)的时间。

  • 相关阅读:
    PKUSC2021游记
    P3349 [ZJOI2016]小星星
    序二
    1.3 解析库的安装
    1.2 请求库的安装
    1.5 存储库的安装
    1.6 Web 库的安装
    1.7 App 爬取相关库的安装
    2.1 HTTP 基本原理
    1.9 部署相关库的安装
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3155347.html
Copyright © 2011-2022 走看看