Dream__maker @ 2024-09-18 08:56:48
先找出最长单词,再把所有单词包含最长单词的字符全改成'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;
}
by CEFqwq @ 2024-09-18 09:27:15
@Dream__maker 怪怪的头像/tx