样例没过,求调
查看原帖
样例没过,求调
759274
Stevehim楼主2023/2/23 16:18
#include <bits/stdc++.h>
using namespace std;
const int seed = 10;
char str[6][100];
unsigned long long s[6][10000];
int p[100010]; //用于记录进制
int len[6];
int n;
bool ifo[6];
int ans = 0;

bool check(int x) { //长度
//	cout << x << endl;
	bool ioo = false;
	for (int i = 1; i <= len[1] - x; i++) { //其实枚举s1的子串就够了,s1没有的那就成不了了
		memset(ifo, false, sizeof(ifo));
		unsigned long long num = s[1][i + x - 1] - s[1][i - 1] * p[x]; //取出字符串
		for (int j = 2; j <= 5; j ++) {
			for (int h = 1; h <= len[j] - x; h++) {
				unsigned long long num2 = s[j][h + x - 1] - s[j][h - 1] * p[x];
//				cout << num << ' ' << num2 << endl;
				if (num == num2) {
//					cout << "ok" << endl;
					ifo[j] = true;
				}
			}
		}
		int num1 = 0;
		for (int i = 2; i <= 5; i++) {
			if (ifo[i]) {
				num1++;
			}
		}
		if (num1 == 4) {
			ioo = true;
			break;
		}
	}
//	bool ioo = true;
	return ioo;
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i ++) { //对输入的串进行哈希操作
		scanf("%s", str[i] + 1);
		len[i] = strlen(str[i] + 1);
		//hash操作
		for (int j = 1; j <= len[i]; j++) {
			s[i][j] = s[i][j - 1] * seed + (str[i][j] - 'a');
		}
		//取出子串
	}
	p[0] = 1;
	for (int i = 1; i <= 200; i++) {
		p[i] = p[i - 1] * seed;
	}
	int mi = 999999999;
	for (int i = 1; i <= n; i++) {
		mi = min(len[i], mi);
	}
	cout << mi << endl;
	int l = 1, r = mi;
	while (l < r) {
		int mid = (l + r) / 2;
		if (check(mid)) {
			ans = mid;
			l = mid + 1;
		} else {
			r = mid ;
		}
	}
	cout << ans;
	return 0;
}

2023/2/23 16:18
加载中...