北京林业大学校赛-D题(A letter from Chensg)

题目链接点击打开链接


这道题的长度比较短,数据也很小,,所以暴力就能过,,采取的办法就是,找到第一个字符串,,枚举它的所有字串,,然后在其它的字符串中找,,如果都存在,说明这个字串是所有字符串共有的,那么我就去判断一下与我当前的ans比较。。。根据题目输出要求,,一开始要保证长度最长,,如果长度一样,,找字典序最小,,那么比较就按这俩个原则比较就行。。


注意,,一开始错了一个,字典序大的长度不一定长,比如串1 asdf  与串2 ss 

那么ss的字典序是比asdf大的!!!


#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 55555;
string s[15];

int main(void)
{
	//freopen("in.txt", "r", stdin);
	int T;
	scanf("%d", &T);

	while (T--)
	{
		bool flag = false;
		int m, i, j, k;
		scanf("%d", &m);
		for (i = 0; i<m; i++)
		{
			cin >> s[i];
		}
		//printf("%d", s[0].length());
		string sub;
		string ans = "";
		for (i = 3; i<=60; i++)
		{
				for (j = 0; j <= 60 - i; j++)
				{
					flag = true;
					sub = s[0].substr(j, i);                  //从j开始的,长度为i子串,进行枚举
					for (k = 1; k < m; k++)
					{
						if (s[k].find(sub) == string::npos)         //如果没有找到
						{
							flag = false;
							break;
						}
					}
					if (flag)
					{
						if (sub.length() > ans.length())             //一定要是长度大于,切记字典序是逐个字符进行比较的,也就是说长度大的不一定字典序大,可能字典序小
							ans = sub;
						else if (sub.length() == ans.length() && sub < ans)
							ans = sub;
					}
				}
			
		}
		if (ans.length()<3)
			printf("No significant commonalities\n");
		else
			cout << ans << endl;
	}
	return 0;
}


你可能感兴趣的:(北京林业大学校赛)