真就玄学
查看原帖
真就玄学
326780
Albert_van楼主2021/8/26 20:17

记录一

记录二

代码一模一样,前者 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]);
}```
2021/8/26 20:17
加载中...