poj 3450

题意:给你n个的串,求出它们的最长公共子串,如果不存在这个子串,则输出“IDENTITY LOST”,如果存在多个最长公共子串,则输出字典序最小的那一个。

代码:

#include<iostream>
#include<fstream>

using namespace std;

char c[4001][202];
int len[4001];
int next[210];
char str[210];
int n;

void getnext(char c[]){
	int i,j,k;
	int len=strlen(c);
	j=0;k=-1;next[0]=-1;
	while(j<len)
	{
		if(k==-1||c[j]==c[k])
			next[++j]=++k;
		else
			k=next[k];
	}
}


int kmp(){
	int i,j,k;
	getnext(str);
	int lenn=strlen(str);
	int maxx=202,minn;
	for(i=1;i<=n;i++)
	{
		j=0;k=0;minn=0;
		while(j<len[i]&&k<lenn)
		{
			if(k==-1||c[i][j]==str[k])
			{
				k++;j++;
			}
			else
				k=next[k];
			minn=max(minn,k);
		}
		maxx=min(maxx,minn);
	}
	return maxx;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s;
	char re[202],tmp[202];
	int ans;
	while(cin>>n)
	{
		if(n==0) return ;
		for(i=1;i<=n;i++)
		{
			cin>>c[i];
			len[i]=strlen(c[i]);
		}
		 ans=-1;
		for(s=0;s<len[1];s++)
		{
			strcpy(str,c[1]+s);
			j=kmp();
			if(ans<j)
			{
				ans=j;
				for(i=0;i<ans;i++)
					re[i]=str[i];
				re[i]='\0';
			}
			else
				if(ans==j)
				{
					for(i=0;i<ans;i++)
						tmp[i]=str[i];
					tmp[i]='\0';
					if(strcmp(tmp,re)<0)
						strcpy(re,tmp);
				}
		}
		if(ans==0)
			cout<<"IDENTITY LOST"<<endl;
		else
			cout<<re<<endl;

	}
	
}

int main(){
	read();
	return 0;
}

posted on 2011-05-19 16:04  宇宙吾心  阅读(442)  评论(0)    收藏  举报

导航