真就玄学

P4683 [IOI2008] Type Printer

Albert_van @ 2021-08-26 20:17:55

记录一

记录二

代码一模一样,前者 85 pts,后者 81 pts

顺便求帮忙调一下吧 qwq,trie 树,和题解一个思路,记录答案的数组开大以后,RE 的点 A 了,但是多了一个 WA 的点,而且这题还不给下数据

(给下数据我还会来求助吗 QAQ)


#include <cstdio>
#include <cstring>

using namespace std;

const int N=25000,LEN=20;

char ans[3*N*LEN+1];int anssize;

class Kick_Tree{
    public:
        int a[N*LEN+1][26],cnt;
        bool end[N*LEN+1],tag[N*LEN+1];
        void insert(char s[],int now,int pos){
            if(pos==strlen(s)){
                end[now]=1;return ;
            }
            int ch=s[pos]-'a';
            if(!a[now][ch]) a[now][ch]=++cnt;
            insert(s,a[now][ch],pos+1);
        }
        void mark(char s[]){
            int now=0,n=strlen(s);
            for(int i=0;i<n;++i) now=a[now][s[i]-'a'],tag[now]=1;
        }
        bool inpath;
        void dfs(int now){
            if(end[now]) ans[anssize++]='P';
            int tagnxt=-114514;
            for(int i=0;i<26;++i) if(a[now][i]){
                if(tag[a[now][i]]){
                    tagnxt=i;continue;
                }
                ans[anssize++]=i+'a';dfs(a[now][i]);
            }
            if(tagnxt>=0) ans[anssize++]=tagnxt+'a',dfs(a[now][tagnxt]);
            if(tagnxt<0&&tag[now]) inpath=1;
            if(!inpath) ans[anssize++]='-';
        }
}st;

int main()
{
    int n;scanf("%d",&n);
    char mx[LEN+1];
    while(n--){
        char s[LEN+1];scanf("%s",s);
        if(strlen(s)>strlen(mx)) strcpy(mx,s);
        st.insert(s,0,0);
    }
    st.mark(mx);st.dfs(0);
    printf("%d\n",anssize);
    for(int i=0;i<anssize;++i) printf("%c\n",ans[i]);
}```

by Albert_van @ 2021-08-26 20:28:37

输入的字符串放外面就过了...

此帖完结


|