poj3080

题意是给出一些长度为60的字符串求这些字符串的最大连续共同子串。

刚开始看了别人的博客说时间给的很松暴力也能0ms过去,就直接写了个最笨的暴力以为能水过去,就是遍历第一个字符串每个字母开始的每个子串是否被后面的所有字符串包含找到最长的。竟然直接TLE了,剪了下枝把各个字母开始的确认为不行以后的子串的检查都给跳过就水过去了但是也花了141ms应该没那么水时间还是蛮紧的。

#include<iostream>
#include<Cstdio>
#include<string>
using namespace std;

string word[20];
int caseSize;
string ans;
int ansL;

bool find(string input)
{
	int limit = 60 - input.length(), i, res = 0;
	int j, l = input.length(); bool flag;
	for(i = 1; i < caseSize; i++)
	{
		flag = false;
		for(j = 0; j <= limit; j++)
		{
			if(word[i].substr(j, l) == input)
				flag = true;
		}
		if(!flag)
			return false;
	}
	return true;
}


void check(int start, int limit)
{
	string temp; int i, j, k, p;
	for(i = ansL; i <= limit; i++)
	{
		temp = word[0].substr(start, i);
		if(find(temp))
		{
			p = temp.length();
			if(p > ansL)
			{
				ansL = p;
				ans = temp;
			}
			else if(temp.length() == ansL && temp < ans)
			{
				ans = temp;
			}
		}
		else
			return;
	}
}

void cmp()
{
	int i, limit;
	for(i = 0; i < 60; i++)
	{
		limit = 60 - i;
		check(i, limit);
	}
}


int main()
{
	int size, i;
	cin >> size;
	while(size--)
	{
		cin >> caseSize;
		for(i = 0; i < caseSize; i++)
		{
			cin >> word[i];
		}
		ansL = 1; ans = "";
		cmp();
		if(ansL >= 3)
		    cout << ans << endl;
		else
			cout << "no significant commonalities" << endl;

	}
	return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值