当前位置: 首页 > news >正文

cogs2223 [SDOI2016 Round1] 生成魔咒

cogs2223 [SDOI2016 Round1] 生成魔咒


原题链接


题解

暴力:每次更新后缀数组???
set+二分+hash暴力 http://paste.ubuntu.com/25496298/
正解:把串反过来,答案不变,但每次只需插入一个后缀。
先预处理出整个后缀数组,然后set插入。
len=n时,\(ans=\frac{n(n+1)}{2}-\sum ht[i]\)


Code

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
#define Fname "magic"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
#define mp make_pair
#define pr pair<unsigned int,ll>
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
const int maxn=600100;
int c[maxn],data[maxn],n,tot;
struct node{int l;};
il node Make(int a){return(node){a};}
set<node>s;
int sa[maxn],rk[maxn],tmp[maxn],buc[maxn],m,ht[maxn],st[maxn][19];
il vd Qsort(){
    rep(i,0,m)buc[i]=0;
    rep(i,1,n)buc[rk[tmp[i]]]++;
    rep(i,1,m)buc[i]+=buc[i-1];
    drep(i,n,1)sa[buc[rk[tmp[i]]]--]=tmp[i];
}
il bool cmp(int*h,int a,int b,int l){return h[a]==h[b]&&h[a+l]==h[b+l];}
il vd solve(){
    m=tot;
    rep(i,1,n)rk[i]=c[i],tmp[i]=i;
    Qsort();
    int p=0;
    for(rg int l=1;p<n;l<<=1){
    p=0;
    rep(i,n-l+1,n)tmp[++p]=i;
    rep(i,1,n)if(sa[i]>l)tmp[++p]=sa[i]-l;
    Qsort();
    rep(i,1,n)tmp[i]=rk[i];
    p=rk[sa[1]]=1;
    rep(i,2,n)
        if(cmp(tmp,sa[i],sa[i-1],l))rk[sa[i]]=p;
        else rk[sa[i]]=++p;
    m=p;
    }
    p=0;
    rep(i,1,n)sa[rk[i]]=i;
    rep(i,1,n){
    if(p)--p;
    if(rk[i]==n)continue;
    while(c[i+p]==c[sa[rk[i]+1]+p])++p;
    ht[rk[i]]=st[rk[i]][0]=p;
    }
    int Log=log2(n);
    rep(i,1,Log)drep(j,n-(1<<i)+1,1)st[j][i]=min(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}
bool operator <(node AAA,node BBB){return rk[AAA.l]<rk[BBB.l];}
il int lcp(int a,int b){
    a=rk[a],b=rk[b];
    if(a==b)return n-a+1;
    if(a>b)swap(a,b);--b;
    int Log=log2(b-a+1);
    return min(st[a][Log],st[b-(1<<Log)+1][Log]);
}
int main(){
    freopen(Fname".in","r",stdin);
    freopen(Fname".out","w",stdout);
    n=gi();
    rep(i,1,n)c[n-i+1]=data[n-i+1]=gi();c[n+1]=-23333333;
    sort(data+1,data+1+n);
    tot=unique(data+1,data+1+n)-data-1;
    rep(i,1,n)c[i]=lower_bound(data+1,data+tot+1,c[i])-data;
    solve();
    puts("1"),s.insert(Make(n));
    ll ht=0;
    set<node>::iterator it,itl,itr;
    drep(i,n-1,1){
    it=s.insert(Make(i)).first;
    itl=it,--itl;
    itr=it,++itr;
    if(it==s.begin())ht+=lcp(it->l,itr->l);
    else if(itr==s.end())ht+=lcp(itl->l,it->l);
    else ht+=lcp(it->l,itr->l)+lcp(itl->l,it->l)-lcp(itl->l,itr->l);
    printf("%lld\n",(ll)(n-i+1)*(n-i+2)/2-ht);
    }
    return 0;
}

转载于:https://www.cnblogs.com/xzz_233/p/7498839.html

相关文章:

  • Sql 时间做条件
  • SQL Server 数据库中的几个常见的临界值
  • A Research Problem UVA - 10837 欧拉函数逆应用
  • 洛谷P2344 奶牛抗议
  • python归档:笔记转化
  • 理解JS中的call、apply、bind方法
  • Number Math
  • 初学JAVA的变量作用域
  • Inno Setup自定义安装界面脚本
  • Spring AOP简单的配置(注解和xml配置)
  • Swift,枚举
  • java操作Excel
  • 'NoneType' object is not iterable
  • AngularJS
  • C++ 清空队列(queue)的几种方法
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CSS中外联样式表代表的含义
  • Git的一些常用操作
  • mysql 5.6 原生Online DDL解析
  • Python学习笔记 字符串拼接
  • python学习笔记-类对象的信息
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vue2.0 实现互斥
  • vue2.0项目引入element-ui
  • webgl (原生)基础入门指南【一】
  • 安卓应用性能调试和优化经验分享
  • 包装类对象
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前言-如何学习区块链
  • 数组大概知多少
  • 算法-图和图算法
  • 白色的风信子
  • gunicorn工作原理
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​secrets --- 生成管理密码的安全随机数​
  • #1014 : Trie树
  • #android不同版本废弃api,新api。
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (BFS)hdoj2377-Bus Pass
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (k8s中)docker netty OOM问题记录
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (动态规划)5. 最长回文子串 java解决
  • (二)PySpark3:SparkSQL编程
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (强烈推荐)移动端音视频从零到上手(下)