k-substrings Codeforces - 961F
不会做。。
官方题解:
1.枚举某个前缀(指题目要求的相同前后缀中的前缀)的中心位置i,那么对应后缀的中心位置已经确定了(n-i+1),可以二分答案求出对于每个中心位置i最大的符合要求的相同前后缀(设长度为2x+1),然后更新ans[i-x]为2x+1;最后把每个ans[i]用ans[i-1]-2尝试更新一下
2.其实以上做法也基于这个结论?
ans[i-1]<=ans[i]+2,这个可以容易地用反证法证明(类似kmp)
因此从ans[(n+1)/2]开始求就行了
#include<cstdio>
#include<algorithm>
using namespace std;
namespace Hash
{
typedef unsigned long long ULL;
const int md2=;
struct Hdata
{
ULL d1;int d2;
Hdata(ULL a,int b):d1(a),d2(b<md2?(b<?b+md2:b):b-md2){}
Hdata():d1(),d2(){}
};
Hdata operator*(const Hdata &a,int b) {return Hdata(a.d1*b,ULL(a.d2)*b%md2);}
Hdata operator*(const Hdata &a,const Hdata &b) {return Hdata(a.d1*b.d1,ULL(a.d2)*b.d2%md2);}
Hdata operator+(const Hdata &a,int b) {return Hdata(a.d1+b,a.d2+b);}
Hdata operator-(const Hdata &a,const Hdata &b) {return Hdata(a.d1-b.d1,a.d2-b.d2);}
bool operator==(const Hdata &a,const Hdata &b) {return a.d1==b.d1&&a.d2==b.d2;}
}
using Hash::Hdata;
char s[];
Hdata hs[];
const int X=;
Hdata pwx[];
Hdata ghash(int l,int r)
{
if(l>r) return Hdata(,);
return hs[r]-hs[l-]*pwx[r-l+];
}
int n,ans[],l;
bool issame(int l1,int r1,int l2,int r2)
{
if(l1<||l1>n||r1<||r1>n||l2<||l2>n||r2<||r2>n) return ;
return ghash(l1,r1)==ghash(l2,r2);
}
int main()
{
int i,j;
scanf("%d%s",&n,s+);
for(i=;i<=n;i++) hs[i]=hs[i-]*X+s[i];
pwx[]=Hdata(,);
for(i=;i<=n;i++) pwx[i]=pwx[i-]*X;
l=(n+)/;
if(n%==) ans[l]=-;
else ans[l]=s[l]==s[l+]?:-;
for(i=l-;i>=;i--)
{
for(j=ans[i+]+;j!=-&&!issame(i,i+j-,n-i-j+,n-i+);j-=);
ans[i]=j;
}
for(i=;i<=l;i++) printf("%d ",ans[i]);
return ;
}
k-substrings Codeforces - 961F的更多相关文章
- Good Substrings CodeForces - 271D
You've got string s, consisting of small English letters. Some of the English letters are good, the ...
- Erasing Substrings CodeForces - 938F (字符串dp)
大意: 给定字符串$s$, 长度为$n$, 取$k=\lfloor log2(n)\rfloor$, 第$i$次操作删除一个长度为$2^{i-1}$的子串, 求一种方案使得, $k$次操作后$s$的字 ...
- Codeforces 961F - k-substrings(二分+哈希)
Codeforces 题面传送门 & 洛谷题面传送门 介绍一种奇怪的 \(\Theta(n\log n)\) 的奇怪做法. 注意到这个"border 的长度必须是奇数"的条 ...
- Many Equal Substrings CodeForces - 1029A (kmp next数组应用)
题目大意 题目看样例也能猜到就是输出最短的循环串. 吐槽 明明是div3第一题为啥子还会用到kmp的知识? 解法 这个题仔细看发现是求最长可去除的后缀,也就是说去除跟下一个相同的字符串还能连接起来.这 ...
- Codeforces Global Round 8 B. Codeforces Subsequences(构造)
题目链接:https://codeforces.com/contest/1368/problem/B 题意 构造最短的至少含有 $k$ 个 $codeforces$ 子序列的字符串. 题解 如下表: ...
- codeforces271D
Good Substrings CodeForces - 271D 给你一个只包含小写字母的字符串s.问你在这个字符串中有多少个不同的子串.且要求这些子串中不得出现超过k个的特殊字母.*子串s1和子串 ...
- 【HDU 5030】Rabbit's String (二分+后缀数组)
Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...
- hdu 5030 Rabbit's String(后缀数组&二分法)
Rabbit's String Time Limit: 40000/20000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- django模型操作
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表
随机推荐
- HDU1087 Super Jumping! Jumping! Jumping!(LIS)
题目意思: http://acm.hdu.edu.cn/showproblem.php? pid=1087 此题的意思求最长上升子序列的和. 题目分析: 在求最长上升子序列的时候,不在保存最长的个数, ...
- sklearn特征工程总结
转自: http://www.cnblogs.com/jasonfreak/p/5448385.html https://www.zhihu.com/question/28641663/answer/ ...
- Ribbon简介
Ribbon简介
- Centos5设置静态IP地址
1.设置静态IP地址,修改/etc/sysconfig/network-scripts/ifcfg-eth0的内容: DEVICE=eth0 #网卡对应的设备别名 BOOTPROTO=static # ...
- Android NFC近场通信02----读写卡的准备工作
Android NFC近场通信02----读写卡的准备工作 因为公司接了一个听上去感觉比較NB的项目.给某油田做派工系统 .并由小女子负责Androi ...
- Office EXCEL 表格如何设置某个单元格是选择项,如何设置一级下拉菜单
1 比如我要在C这一列都做成下拉菜单,则我选中这一列的第一个单元格,然后点击数据-有效性,然后把允许改成"序列",在来源中输入每一项(用逗号隔开),比如我一共要做四个下拉菜单选项, ...
- Deepin-安装和卸载软件
一般默认厂商源安装软件 安装软件: 示例:sudo apt-get install xx 实例:sudo apt-get install nodejs 卸载软件: 示例:sudo apt-get -- ...
- MySql 基本操作语句整理
数据库 DATABASE: 创建 CREATTE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [DEFAULT] CHARACTER SET [=] cha ...
- 微信小程序之 Classify(商品属性分类)
1.项目目录 2.逻辑层 broadcast.js // pages/broadcast/broadcast.js Page({ /** * 页面的初始数据 */ data: { firstIndex ...
- cf246 ENew Reform (并查集找环)
Berland has n cities connected by m bidirectional roads. No road connects a city to itself, and each ...