POJ 3080 (字符串匹配)

题目链接:http://poj.org/problem?id=3080

题意:给出n个字符串,找出其最长公共子串,若子串长度>3,则输出最长公共子串,否则输出...

本来以为要用到kmp或者后缀数组什么的,思考了很久没有思路,看了一下discuss,发现可以暴力过,而且0ms,也是醉了...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;

const int INF=0x3f3f3f3f;
const int maxn=100010;
int T,n;
char str[15][80];
char tmp[80],ans[80];

int main(){
#ifndef ONLINE_JUDGE
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
#endif
	scanf("%d",&T);
	while(T--){
		memset(ans,'\0',sizeof(ans));//初始化字符串
		scanf("%d",&n);
		for(int i=0;i<n;i++)
			scanf("%s",str[i]);
		for(int length=1;length<=60;length++){//当前枚举字符串的长度
			bool find=false;
			for(int j=0;j<=60-length;j++){//可以枚举的字符子串的个数
				int len=0;
				for(int k=j;len!=length;k++){//复制子串到tmp中
					tmp[len++]=str[0][k];
				}
				tmp[length]='\0';//添加字符串终止符
				bool flag=true;
				for(int k=1;k<n;k++){//在其他所有字符串中查找是否有该子串,如果有一个没有,则失败
					if(!strstr(str[k],tmp)){
						flag=false;
						break;
					}
				}
				if(flag){
					find=true;
					if(strlen(ans)<strlen(tmp))
						strcpy(ans,tmp);
					else if(strcmp(ans,tmp)>0)//字典序
						strcpy(ans,tmp);
				}
			}
			if(!find) break;//如果当前枚举的子串长度匹配不到,则后面就没必要继续匹配
		}
		if(strlen(ans)>=3) printf("%s\n",ans);
		else printf("no significant commonalities\n");
	}
	return 0;
}


你可能感兴趣的:(POJ 3080 (字符串匹配))