• 【洛谷P1368】工艺


    题面

    https://www.luogu.org/problem/P1368

    题解

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<map>
    #define ri register int
    #define N 300050
    using namespace std;
    int l;
    struct node{
      int ff,len;
      map<int,int> ch;
    } t[N<<2];
    
    int a[N];
    struct SAM {
      int tot,las;
      inline void init() {
        tot=las=1;
      }
      inline void extend(int c) {
        int np=++tot,p=las; las=tot;
        t[np].len=t[p].len+1;
        while (p && !t[p].ch[c]) t[p].ch[c]=np,p=t[p].ff;
        if (!p) {
          t[np].ff=1;
        }
        else {
          int q=t[p].ch[c];
          if (t[q].len==t[p].len+1) {
            t[np].ff=q;
          }
          else {
            int nq=++tot;
            t[nq]=t[q]; t[nq].len=t[p].len+1;
            t[np].ff=t[q].ff=nq;
            while (p && t[p].ch[c]==q) t[p].ch[c]=nq,p=t[p].ff;
          }
        }
      }
    } sam;
    int main(){
      sam.init();
      scanf("%d",&l);
      for (ri i=1;i<=l;i++) scanf("%d",&a[i]);
      for (ri i=1;i<=l;i++) sam.extend(a[i]);
      for (ri i=1;i<=l;i++) sam.extend(a[i]);
      int now=1;
      for (ri i=1;i<=l;i++) {
        printf("%d ",t[now].ch.begin()->first);
        now=t[now].ch.begin()->second;
      }
    }
  • 相关阅读:
    转载阿里开源的分布式事务框架 Seata
    查看进程上的线程数量
    chmod命令
    查找端口与查找正在运行的进程
    可输入的文本框
    js 类和对象
    js 三维数组
    ajax
    ORACLE数据库主要的系统表和数据字典视图
    url 传参
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11279291.html
Copyright © 2020-2023  润新知