编程珠玑---读书笔记---使用后缀数组查找最长重复子串

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

看代码:

 

#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]='\0';

	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\n",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)的时间。

 

你可能感兴趣的:(读书笔记)