11512

#include <iostream>
#include <cstdio>
#include <sstream>
#include <string>
#include <algorithm>
#include <cstring>

using namespace std;
string str;
struct node{
	int fst;
	int ed;
	int idx;
}arr[1010];
int L[17][1010];
int RANK[1010];
int lcp[1010];
int FoundAtIndex;
int cnt;
string resStr;

bool cmp(node a,node b)
{
	return (a.fst==b.fst?(a.ed<b.ed?1:0):(a.fst<b.fst?1:0));
}

void suffixArray()
{
	for(int i=0;i<str.size();i++)
		L[0][i]=str[i]-'A';
	int stp=1;
	for(int cnt=1;cnt/2<str.size();cnt*=2,stp++)
	{
		for(int i=0;i<str.size();i++)
		{
			arr[i].fst=L[stp-1][i];
			arr[i].ed=(i+cnt)<str.size()?L[stp-1][i+cnt]:-1;
			arr[i].idx=i;
		}
		sort(arr,arr+str.size(),cmp);
		for(int i=0;i<str.size();i++)
		{
			L[stp][arr[i].idx]=(i>0 && arr[i-1].fst==arr[i].fst && arr[i-1].ed==arr[i].ed)?L[stp][arr[i-1].idx]:i;
		}
	}
}

int isLess(string a,string b)
{
	for(int i=0;i<a.size();i++)
	{
		if((a[i]-'0')<(b[i]-'0'))
		return 1;
		if((a[i]-'0')>(b[i]-'0'))
		return -1;
	}
	return 0;
}
int MaxLCP()
{
	for(int i=0;i<str.size();i++)
	{
		lcp[i]=0;
		RANK[arr[i].idx]=i;
	}
	string tmp;
	int k=0,j;
	int len=str.size();
	int mx=0;
	cnt=0;
	for(int i=0;i<len;i++,k?k--:0)
	{
		if(RANK[i]==str.size()-1)
		continue;
		i = arr[RANK[i]].idx;
		j = arr[RANK[i]+1].idx;
		while(i+k<len && j+k<len && str[i+k]==str[j+k])
		k+=1;
		lcp[RANK[i]]=k;
		if(mx<k)
		{
			mx=k;
			FoundAtIndex=i;
			cnt=2;
			resStr="";
			for(int l=i;l<i+k;l++)
			resStr.append(1u,str[l]);
		}
		else if(mx==k)
		{
			tmp="";
			for(int l=i;l<i+k;l++)
			tmp.append(1u,str[l]);
			int f=isLess(tmp,resStr);
			if(f==1)
			{
				resStr=tmp;
				cnt=2;
			}
			else if(f==0)
			cnt+=1;
		}

	}
	return mx;
}
int main()
{
	int n,mxLength;
	scanf("%d",&n);
	while(n--)
	{
		cin>>str;
		suffixArray();
		mxLength = MaxLCP();
		if(mxLength==0)
		{
			printf("No repetitions found!\n");
		}
		else
		{
			cout<<resStr<<" "<<cnt<<"\n";
		}
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *