【HDOJ】3553 Just a String
后缀数组加二分可解。
/* 3553 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int maxl = ;
const int maxn = maxl;
int a[maxn*];
int rrank[maxn], height[maxn], sa[maxn*];
int wa[maxn], wb[maxn], wc[maxn], wv[maxn];
int dp[maxn][];
__int64 tot[maxn];
char s[maxl];
__int64 kth; bool c0(int *r, int a, int b) {
return r[a]==r[b] && r[a+]==r[b+] && r[a+]==r[b+];
} bool c12(int k, int *r, int a, int b) {
if (k == )
return r[a]<r[b] || (r[a]==r[b] && c12(, r, a+, b+));
else
return r[a]<r[b] || (r[a]==r[b] && wv[a+]<wv[b+]);
} void sort(int *r, int *a, int *b, int n, int m) {
int i; for (i=; i<n; ++i) wv[i] = r[a[i]];
for (i=; i<m; ++i) wc[i] = ;
for (i=; i<n; ++i) wc[wv[i]]++;
for (i=; i<m; ++i) wc[i] += wc[i-];
for (i=n-; i>=; --i) b[--wc[wv[i]]] = a[i];
} #define F(x) ((x)/3 + ((x)%3==1 ? 0:tb))
#define G(x) ((x)<tb ? (x)*3+1 : ((x)-tb)*3+2)
void dc3(int *r, int *sa, int n, int m) {
int i, j, *rn=r+n, *san=sa+n, ta=, tb=(n+)/, tbc=, p; r[n] = r[n+] = ;
for (i=; i<n; ++i) if (i%!=) wa[tbc++] = i;
sort(r+, wa, wb, tbc, m);
sort(r+, wb, wa, tbc, m);
sort(r, wa, wb, tbc, m);
for (p=, rn[F(wb[])]=, i=; i<tbc; ++i)
rn[F(wb[i])] = c0(r, wb[i-], wb[i]) ? p- : p++;
if (p < tbc)
dc3(rn, san, tbc, p);
else
for (i=; i<tbc; ++i) san[rn[i]] = i;
for (i=; i<tbc; ++i)
if (san[i] < tb)
wb[ta++] = san[i] * ;
if (n% == )
wb[ta++] = n - ;
sort(r, wb, wa, ta, m);
for (i=; i<tbc; ++i) wv[wb[i]=G(san[i])] = i;
for (i=,j=,p=; i<ta && j<tbc; ++p)
sa[p] = c12(wb[j]%, r, wa[i], wb[j]) ? wa[i++] : wb[j++];
while (i < ta) sa[p++] = wa[i++];
while (j < tbc) sa[p++] = wb[j++];
} void calheight(int *r, int *sa, int n) {
int i, j, k = ; for (i=; i<=n; ++i) rrank[sa[i]] = i;
for (i=; i<n; height[rrank[i++]]=k)
for (k?k--:, j=sa[rrank[i]-]; r[j+k]==r[i+k]; ++k) ;
} void init_RMQ(int n) {
int i, j; for (i=; i<=n; ++i) dp[i][] = i;
for (j=; (<<j)<=n; ++j)
for (i=; i+(<<j)-<=n; ++i)
if (height[dp[i][j-]] < height[dp[i+(<<(j-))][j-]])
dp[i][j] = dp[i][j-];
else
dp[i][j] = dp[i+(<<(j-))][j-];
} int RMQ(int l, int r) {
if (l > r)
swap(l, r); ++l;
int k = ; while (<<(k+) <= r-l+)
++k; if (height[dp[l][k]] < height[dp[r-(<<k)+][k]])
return dp[l][k];
else
return dp[r-(<<k)+][k];
} void printSa(int n) {
for (int i=; i<=n; ++i)
printf("%d ", sa[i]);
putchar('\n');
} void printHeight(int n) {
for (int i=; i<=n; ++i)
printf("%d ", height[i]);
putchar('\n');
} void solve() {
int n = ; for (int i=; ; ++i) {
if (s[i] == '\0') {
n = i;
break;
}
a[i] = s[i];
}
a[n] = ; dc3(a, sa, n+, );
calheight(a, sa, n);
init_RMQ(n); rep(i, , n+)
tot[i] = tot[i-] + n - sa[i]; int l = , r = n, mid, idx;
int pre = ;
int pos = , len;
__int64 tmp; while (l < r) {
idx = RMQ(l, r);
mid = idx - ;
tmp = 1LL * (height[idx] - pre) * (r-l+);
if (kth <= tmp) {
pos = l;
len = pre + (kth+r-l)/(r-l+);
break;
}
kth -= tmp;
tmp = tot[mid] - tot[l-] - 1LL * height[idx] * (mid-l+);
if (kth <= tmp) {
r = mid;
} else {
kth -= tmp;
l = mid + ;
}
pre = height[idx];
} if (pos == ) {
pos = l;
len = pre + kth;
} rep(i, , len)
putchar(s[sa[pos]+i]);
putchar('\n');
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int t; scanf("%d", &t);
rep(tt, , t+) {
scanf("%s %I64d", s, &kth);
printf("Case %d: ", tt);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
数据生成器。
from random import randint, shuffle
import shutil
import string def GenDataIn():
with open("data.in", "w") as fout:
t = 20
bound = 10**3
uc = list(string.uppercase)
fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(100, 200)
kth = randint(1, n*(n+1)/2)
line = ""
for i in xrange(n):
idx = randint(0, 25)
line += uc[idx]
fout.write("%s %d\n" % (line, kth)) def MovDataIn():
desFileName = "F:\eclipse_prj\workspace\hdoj\data.in"
shutil.copyfile("data.in", desFileName) if __name__ == "__main__":
GenDataIn()
MovDataIn()
【HDOJ】3553 Just a String的更多相关文章
- Android NDK 【错误】The method loadLibrary(String) is undefined for the type Settings.Syste
[错误]The method loadLibrary(String) is undefined for the type Settings.System [解决方法] 不要加入包import andr ...
- 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
[手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...
- 【LeetCode】678. Valid Parenthesis String 解题报告(Python)
[LeetCode]678. Valid Parenthesis String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人 ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【原创】-- C# 点滴积累 -- String
一.string.Format() 将[数字字符串]转为两位小数显示的字符串: dt = dtResult.Select(it => new CommodityPriceLimitEntity ...
- 【转载】NULL,"",String.Empty三者在C#中的区别
(1)NULLnull 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类 ...
- 【HDOJ】5632 Rikka with Array
1. 题目描述$A[i]$表示二级制表示的$i$的数字之和.求$1 \le i < j \le n$并且$A[i]>A[j]$的$(i,j)$的总对数. 2. 基本思路$n \le 10^ ...
- 【HDOJ】4579 Random Walk
1. 题目描述一个人沿着一条长度为n个链行走,给出了每秒钟由i到j的概率($i,j \in [1,n]$).求从1开始走到n个时间的期望. 2. 基本思路显然是个DP.公式推导也相当容易.不妨设$dp ...
随机推荐
- GET 和 POST 两种方式来完成Http接口
程序使用 HTTP 协议和服务器交互主要是进行数据的提交,通常数据的提交是通过 GET 和 POST 两种方式来完成,下面对这两种方式(.net c#)进行一下说明: 1. GET 方式. GET 方 ...
- SQL Server如何使用XML格式传输解析
Sqlserver in 实现 参数化查询 XML类型解决方案 [转] :如果参数是int类型: declare @a xml set @a=' <row><id>1</ ...
- python字典操作
Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型.一.创建字典字典由键和对应值成对组成.字典也被称作关联数组或哈希表.基本语法如下: 代码如下: dict ...
- Oracle中正则表达式的使用
Oracle10开始支持正则表达式. ORACLE中的支持正则表达式的函数主要有下面四个: 1. REGEXP_LIKE : 与LIKE的功能相似 2. REGEXP_INSTR : ...
- nginx+php-fpm 502 bad gateway
输出日志配置: http://blog.csdn.net/wzy_1988/article/details/8486888 解决方案: http://www.cnblogs.com/jackluo/p ...
- (转)[C++语法] 关键字typedef用法
转自http://www.cnblogs.com/SweetDream/archive/2006/05/10/395921.html C/C++语言中的typedef相信大家已经不陌生,本文对C/C+ ...
- 100 doors
Question There are 100 doors in a row that are all initially closed. You make 100 passes by the door ...
- Delphi XE5 android 获取电池电量
uses AndroidAPI.JNI.GraphicsContentViewText, AndroidAPI.JNI.JavaTypes, AndroidAPI.JNI.OS; function B ...
- SpringJUnit4加载类目录下(src)和WEF-INF目录下的配置文件
路径说明: 一.加载类目录下的配置文件 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:ap ...
- c#保留小数点后两位
double d = 23423.24234234d; Response.Write(d.ToString("0.00"));