【bzoj4486】【JSOI2015】串分割

老省选题了。

首先考虑怎么比较超长数字的大小?

参见UTR1的那道题

先比size,然后比较字典序即可。

接下来考虑下切割的问题。

因为要将字符串切割成k份,所以这个字符串只会存在n/k个本质不同的起始位置。

然后可能会发现,如果能够整除的话,将这些起始位置直接后缀排序就可以了。

那么如果不能整除怎么办?

我们可以发现,如果有多余的,那么最长的字符串一定最多比别人多1

这个贪心的正确性比较的显然。

那么我们怎么处理长度不同的呢?

将之前的比较二分即可。

#include<bits/stdc++.h>
#define N 400010
using namespace std;
int t1[N],t2[N],a[N],sa[N],rk[N],c[20],h[N];
int n,m,k,cnt;
char s[N];
void calcsa(int n,int m){
    int *x=t1,*y=t2,f=0,p=0;
    for(int i=1;i<=m;i++)c[i]=0;
    for(int i=1;i<=n;i++)c[x[i]=a[i]]++;
    for(int i=1;i<=m;i++)c[i]+=c[i-1];
    for(int i=n;i;i--)sa[c[x[i]]--]=i;
    for(int i=1;i<=n&&p<=n;i<<=1){p=0;
        for(int j=n-i+1;j<=n;j++)y[++p]=j;
        for(int j=1;j<=n;j++)if(sa[j]>i)y[++p]=sa[j]-i;
        for(int j=1;j<=m;j++)c[j]=0;
        for(int j=1;j<=n;j++)c[x[y[j]]]++;
        for(int j=1;j<=m;j++)c[j]+=c[j-1];
        for(int j=n;j>=1;j--)sa[c[x[y[j]]]--]=y[j];
        swap(x,y);x[sa[1]]=1;p=2;
        for(int j=2;j<=n;j++)
        x[sa[j]]=y[sa[j]]==y[sa[j-1]]&&y[sa[j]+i]==y[sa[j-1]+i]?p-1:p++;
        m=p;
    }
    for(int i=1;i<=n;i++)rk[sa[i]]=i;
    for(int i=1;i<=n;i++){
        int j=sa[rk[i]-1];
        if(f)f--;while(a[i+f]==a[j+f])f++;
        h[rk[i]]=f;
    }
}
inline bool check(int x){
    int p;
    for(int i=1;i<=m;i++){
        int t=i;p=k;
        while(p--){
            if(rk[t]<=x)t+=m;else t+=m-1;
            if(t>=n+i)return 1;
        }
    }
    return 0;
}
inline void work(){
    int l=1,r=cnt;
    while(l<r){
        int mid=(l+r)>>1;
        if(check(mid))r=mid;else l=mid+1;
    }
    for(int i=1;i<=n;i++)if(rk[i]==l)
    for(int j=i;j<=i+m-1;j++)printf("%c",a[j]+‘1‘);
    puts("");
}
int main(){
    scanf("%d%d",&n,&k);scanf("%s",s+1);
    for(int i=1;i<=n;i++)a[++cnt]=s[i]-‘1‘;
    for(int i=1;i<n;i++)a[++cnt]=s[i]-‘1‘;
    calcsa(cnt,10);
    //for(int i=1;i<=cnt;i++)printf("%d ",sa[i]);puts("");
    m=n/k+(n%k!=0);
    work();
}
时间: 2024-08-05 13:05:07

【bzoj4486】【JSOI2015】串分割的相关文章

「JSOI2015」串分割

「JSOI2015」串分割 传送门 首先我们会有一个贪心的想法:分得越均匀越好,因为长的绝对比短的大. 那么对于最均匀的情况,也就是 \(k | n\) 的情况,我们肯定是通过枚举第一次分割的位置,然后每一段长度 \(\frac{n}{k}\) 最后取最小的. 把这个思想运用到一般情况:如果分出来两段长短不一,那么长的只会比短的那个长度多 \(1\) ,再仔细想想,所有段只会有两种不同的长度 \(\lfloor \frac{n}{k} \rfloor, \lceil \frac{n}{k} \r

C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出【转】

本文转载自;http://www.cnblogs.com/easyfrog/archive/2011/12/26/C_strstr_split_string.html C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: 下面的这个例子是实现 字符串以分割串分割输出: 1 #include <stdio.h> 2 #include <strin

【华为OJ】【063-字符串分割】

[华为OJ][算法总篇章] [华为OJ][063-字符串分割] [工程下载] 题目描述 连续输入字符串(输出次数为N,字符串长度小于100),请按长度为8拆分每个字符串后输出到新的字符串数组, 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 首先输入一个整数,为要输入的字符串个数. 例如: 输入: 2 abc 12345789 输出: abc00000 12345678 90000000 输入描述 首先输入数字n,表示要输入多少个字符串.连续输入字符串(输出次数为N,字符串长度小于1

符串分割(C++) 转载

原文地址:http://www.cnblogs.com/MikeZhang/archive/2012/03/24/MySplitFunCPP.html 这篇文章总结的很好,原文出自上面的地址. 一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串,delim为分隔符字符串. 返回值:从str开头开始的一个个被分割的串.当没有被分割的串时则返回NULL.

lintcode 容易题:Palindrome Partitioning 分割回文串

题目: 分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa","b"], ["a","a","b"] ] 解题: 这个题目不好搞啊,需要动态规划 在这里,没有根据动态规划,也解决了,貌似是暴力解决 从下标pos开始,找到下标i使得 pos到i内是回文字符串,再从i+1开始,找到下一

分割回文串[LintCode]

有问题可以私信我,微博地址:http://weibo.com/1683510813/profile?rightmod=1&wvr=6&mod=personinfo 题目:分割回文串 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa", "b"], ["a", "a", "b"

1、分割回文串——回溯法

题目: 给定一个字符串s,将s分割成一些子串,使每个子串都是回文串. 返回s所有可能的回文串分割方案. 样例 给出 s = "aab",返回 [ ["aa", "b"], ["a", "a", "b"] ] 标签 Expand 回溯法 深度优先搜索 package unit1; import java.util.ArrayList; import java.util.List; publ

Split()分割函数Python实现源码

楼主月初去腾讯时面试官临时给的一道编程题,先说明下,本猿的本职工作是测试拉,所以代码有不合理欢迎大家批评和指导! 先卖个关子吧,上下楼主当时自己临场发挥的代码(当时没觉得,出来后都想给自己一巴掌): ############################################## 1 def split_test(stringstr,charstr): 2 templist = [] 3 for i in range(len(stringstr)): 4 if stringstr[i

算法——回文串专题

双重回文数(复杂版) 题目链接:https://www.luogu.org/problemnew/show/P1207 回文串分割 题目链接:https://www.lintcode.com/problem/palindrome-partitioning/description 原文地址:https://www.cnblogs.com/czc1999/p/10362872.html