98pts 求助
查看原帖
98pts 求助
448887
cancan123456楼主2023/1/17 19:46
#include <cstring>
#include <cstdio>
using namespace std;
char s[3000005];
struct Node {
	int ch[26];
	bool str;
} node[3000005];
int f[3000005];
int cnt = 1;
void insert() {
	int n = strlen(s);
	for (int i = 0; i < n / 2; i++) {
		char c = s[i];
		s[i] = s[n - i - 1];
		s[n - i - 1] = c;
	}
	int p = 1;
	for (int i = 0; i < n; i++) {	
		if (node[p].ch[s[i] - 'a'] == 0) {
			cnt++;
			node[p].ch[s[i] - 'a'] = cnt;
		}
		p = node[p].ch[s[i] - 'a'];
	}
	node[p].str = true;
}
int ans;
int max(int a, int b) {
	return a > b ? a : b;
}
void solve(int p) {
	int fir = 0, sec = 0, cnt = 0;
	for (int i = 0; i < 26; i++) {
		if (node[p].ch[i] != 0) {
			solve(node[p].ch[i]);
			if (f[node[p].ch[i]] > fir) {
				sec = fir;
				fir = f[node[p].ch[i]];
			} else if (f[node[p].ch[i]] == fir) {
				sec = fir;
			} else if (f[node[p].ch[i]] > sec) {
				sec = f[node[p].ch[i]];
			}
			f[p] = max(f[p], f[node[p].ch[i]]);
			if (node[p].str) {
				cnt++;
			}
		}
	}
	if (node[p].str) {
		f[p] += max(cnt - 1, 0) + 1;
	} else {
		f[p] = 0;
	}
	ans = max(ans, fir + sec + (node[p].str ? 1 : 0) + max(cnt - 2, 0));
}
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%s", s);
		insert();
	}
	solve(1);
	printf("%d", ans);
	return 0;
}
2023/1/17 19:46
加载中...