Luogu P4341 [BJWC2010]外星联络

题目描述

暴力思路:

暴力枚举子串,插入trie树中,按字典序输出大于1的end的值

时间复杂度:n3

结果:TLE 0分

。。。非常尴尬的一点不剩


正解思路

经过观察发现,可以只枚举后缀,统计时输出sum的值

code


#include<bits/stdc++.h>

using namespace std;

const int MAXN=1e7;

int n,cnt;

string ss;

struct node{

 int sum,end,son[2];

}trie[MAXN];

void insert(string s)

{

 int now=0,x;

 for(int i=0;i<s.length();i++){

  x=trie[now].son[s[i]-'0'];

  if(x==0){

   x=trie[now].son[s[i]-'0']=++cnt;

  }

  trie[x].sum++;

  now=x;

 }

}

 

void build()

{

 for(int i=0;i<n;i++){

   insert(ss.substr(i,n-i));

 }

}

 

void query(int now)

{

 if(trie[now].sum>1){

  cout<<trie[now].sum<<endl;

 }

 if(trie[now].son[0]){

  query(trie[now].son[0]);

 }

 if(trie[now].son[1]){

  query(trie[now].son[1]);

 }

}

 

int main()

{

// freopen(".in","r",stdin);

// freopen(".out","w",stdout);

 cin>>n>>ss;

 build();

 query(0);

 return 0;

}

据听说正解是SA

可是我太弱了不会呀


upd 2019.9.13

markdown 炸了

又重发了一遍

posted @ 2019-09-13 10:21  zhu_chen  阅读(114)  评论(0编辑  收藏  举报