[关闭]
@MLEAutoMaton 2019-02-11T23:29:16.000000Z 字数 1372 阅读 694

后缀自动机总结

学习笔记 题单


建议大家在观看本文之前观看这个HiHocoder的概念

其实SAM也没有什么难的.

考虑那个构建不就是每一次找一个长度-1的东西去搞.

如果没有的话就构造,然后更新父亲就好了.

那个maxlen串和minlen串的话就直接转移的时候+1就好了.

因为必然会有一个分水岭.

只可能小,不可能大.

代码实现

给出的是某谷模板的代码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<set>
  8. #include<map>
  9. #include<iostream>
  10. using namespace std;
  11. #define ll long long
  12. #define re register
  13. #define file(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout)
  14. inline int gi()
  15. {
  16. int f=1,sum=0;char ch=getchar();
  17. while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  18. while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();}
  19. return f*sum;
  20. }
  21. const int N=2000010;
  22. char s[N];
  23. int c[N],a[N],siz[N];
  24. struct node{
  25. int ff,son[26],len;
  26. }t[N<<1];
  27. int last=1,tot=1;
  28. void extend(int c){
  29. int p=last,np=++tot;last=np;
  30. t[np].len=t[p].len+1;
  31. while(p && !t[p].son[c])t[p].son[c]=np,p=t[p].ff;
  32. if(!p)t[np].ff=1;
  33. else{
  34. int q=t[p].son[c];
  35. if(t[p].len+1==t[q].len)t[np].ff=q;
  36. else{
  37. int nq=++tot;
  38. t[nq]=t[q];t[nq].len=t[p].len+1;
  39. t[q].ff=t[np].ff=nq;
  40. while(p && t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;
  41. }
  42. }
  43. siz[np]=1;
  44. }
  45. int main()
  46. {
  47. scanf("%s",s+1);int len=strlen(s+1);
  48. for(int i=1;i<=len;i++)extend(s[i]-'a');
  49. for(int i=1;i<=tot;i++)c[t[i].len]++;
  50. for(int i=1;i<=tot;i++)c[i]+=c[i-1];
  51. for(int i=1;i<=tot;i++)a[c[t[i].len]--]=i;
  52. ll ans=0;
  53. for(int i=tot;i;i--){
  54. int now=a[i];
  55. siz[t[now].ff]+=siz[now];
  56. if(siz[now]>1)ans=max(ans,1ll*t[now].len*siz[now]);
  57. }
  58. printf("%lld\n",ans);
  59. return 0;
  60. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注