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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值