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
输入的字符串放外面就过了...
此帖完结