怪怪的做法
查看原帖
怪怪的做法
718017
Dream__maker楼主2024/9/18 08:56

先找出最长单词,再把所有单词包含最长单词的字符全改成'z'+1,然后排序,最后暴力做。这样能保证最长单词在最后,并且前几个字母相同的单词是相邻打印的,但是WA25分。

#include <bits/stdc++.h>
using namespace std;
const int N = 25010;
int n, lc, ls, k, ch[N];
char c[N * 30];
struct node
{
	string b;
	string a;
}s[N];
int cmp(node x, node y)
{
	return x.b < y.b;
}
int main()
{
	cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> s[i].a;
		s[i].b = s[i].a;
		if(s[i].a.size() > ls) ls = s[i].a.size(), k = i;
	}
	for(int i = 0; i < s[k].a.size(); i ++) ch[s[k].a[i]] = 1;
	for(int i = 1; i <= n; i ++)
	{
		for(int j = 0; j < s[i].a.size(); j ++)
		{
			if(ch[s[i].a[j]]) s[i].b[j] = 'z' + 1;
		}
	}
	sort(s + 1, s + n + 1, cmp);
	for(int i = 0; i < s[1].a.size(); i ++) c[++ lc] = s[1].a[i];
	c[++ lc] = 'P';
	for(int i = 2; i <= n; i ++)
	{
		int l = s[i - 1].a.size();
		for(int j = 0; j < s[i - 1].a.size() && j < s[i].a.size(); j ++)
		{
			if(s[i - 1].a[j] != s[i].a[j])
			{
				l = j;
				break;
			}
		}
		for(int j = l; j < s[i - 1].a.size(); j ++) c[++ lc] = '-';
		for(int j = l; j < s[i].a.size(); j ++) c[++ lc] = s[i].a[j];
		c[++ lc] = 'P';
	}
	cout << lc << endl;
	for(int i = 1; i <= lc; i ++) printf("%c\n", c[i]);
	return 0;
}
2024/9/18 08:56
加载中...