/*求一串字符串的最长子串(后缀数组问题)*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAXS 1001
char s[MAXS], *a[MAXS];
/*字符串比较(按字典序)*/
int pstrcmp(const void *a, const void *b){
return strcmp(*(char *const *)a, *(char *const *)b);
}
/*求两串的相同子串的长度*/
int comlen(char *a, char *b){
int i = 0;
while(*a && (*a++ == *b++)) i++;
return i;
}
int main(){
int cas;
scanf("%d",&cas);
getchar();
while(cas--){
gets(s);
int len = strlen(s);
for(int i=0; i<len; i++){
a[i] = &s[i];
}
qsort(a,len,sizeof(char*),pstrcmp); //对后缀数组排序
int maxlen = 0, maxi = 0;
for(int i=0; i<len-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]);
}
return 0;
}
求最长子串(后缀数组解法)
最新推荐文章于 2022-02-18 17:34:51 发布