怪怪的做法

P4683 [IOI2008] Type Printer

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


|