【BZOJ-1090】字符串折叠 区间DP + Hash

时间:2022-09-06 22:23:02

1090: [SCOI2003]字符串折叠

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1127  Solved: 737
[Submit][Status][Discuss]

Description

折叠的定义如下: 1. 一个字符串可以看成它自身的折叠。记作S  S 2. X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S)  SSSS…S(X个S)。 3. 如果A  A’, BB’,则AB  A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B)  AAACBB,而2(3(A)C)2(B)AAACAAACBB 给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。

Input

仅一行,即字符串S,长度保证不超过100。

Output

仅一行,即最短的折叠长度。

Sample Input

NEERCYESYESYESNEERCYESYESYES

Sample Output

14

HINT

一个最短的折叠为:2(NEERC3(YES))

Source

Solution

区间DP

f[l][r]表示区间[l,r]最短折叠

那么我们枚举区间长度,枚举区间左端点,枚举断点

$f[l][r]=min(r-l+1,f[l][k]+f[k+1][r]);$

$f[l][r]=min(f[l][r],f[l][k]+2+s);$ 当区间[l,r]能被[l,k]折叠,2为括号,s为系数位数

判断的时候可以暴力判断,不过那么%来%去太鬼畜了,所以直接用个Hash

Code

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
char S[];
int f[][],N;
#define base 13
#define ULL unsigned long long
ULL bin[],hash[];
void Hashtable()
{
bin[]=; for (int i=; i<=N; i++) bin[i]=bin[i-]*base;
for (int i=; i<=N; i++) hash[i]=hash[i-]*base+S[i];
}
inline ULL Gethash(int l,int r) {return hash[r]-hash[l-]*bin[r-l+];}
inline int size(int x) {int re=; while (x) x/=,re++; return re;}
inline bool judge(int l,int m,int r)
{
if ((r-l+)%m) return ;
int tl=(r-l+)/m; ULL t=Gethash(l,l+tl-);
for (int i=l; i<=r; i+=tl)
if (Gethash(i,i+tl-)!=t) return ;
return ;
}
int main()
{
scanf("%s",S+); N=strlen(S+);
Hashtable();
for (int i=; i<=N; i++)
for (int j=; j<=N; j++)
if (j+i-<=N)
{
int l=j,r=j+i-;
f[l][r]=r-l+;
for (int k=; k<=i; k++)
{
f[l][r]=min(f[l][r],f[l][l+k-]+f[l+k][r]);
if (judge(l,k,r)) f[l][r]=min(f[l][r],+size(k)+f[l][l+(r-l+)/k-]);
}
}
printf("%d\n",f[][N]);
return ;
}

【BZOJ-1090】字符串折叠 区间DP + Hash的更多相关文章

  1. BZOJ 1090 字符串折叠&lpar;区间DP&rpar;

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CC ...

  2. BZOJ 1090 字符串折叠(Hash &plus; DP)

    题目链接 字符串折叠 区间DP.$f[l][r]$为字符串在区间l到r的最小值 正常情况下 $f[l][r] = min(f[l][r], f[l][l+k-1]+f[l+k][r]);$ 当$l$到 ...

  3. BZOJ 1090&colon; &lbrack;SCOI2003&rsqb;字符串折叠 区间DP

    1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. &lbrack;SCOI2003&rsqb;字符串折叠 &lpar;区间DP&rpar;

    题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...

  5. bzoj1090 &lbrack;SCOI2003&rsqb;字符串折叠——区间DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1090 区间DP... 代码如下: #include<iostream> #inc ...

  6. bzoj 1090 字符串折叠

    题目大意: 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S)=SSSS…S(X个S). 3. 如果A=A’, B=B’, ...

  7. B1090 &lbrack;SCOI2003&rsqb;字符串折叠 区间dp

    又一道区间dp,和上一篇类似,但是比他简单,这个只有两种转移方法,不是很复杂.直接判断是否为重复的串就行. 题干: Description 折叠的定义如下: . 一个字符串可以看成它自身的折叠.记作S ...

  8. 洛谷P4302 &lbrack;SCOI2003&rsqb;字符串折叠&lpar;区间dp&rpar;

    题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...

  9. BZOJ 2121&colon; 字符串游戏 区间DP &plus; 思维

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

随机推荐

  1. mysql 启动服务

    http://blog.chinaunix.net/uid-13642598-id-3153537.html mysql的四种启动方式: 1.mysqld 启动mysql服务器:./mysqld -- ...

  2. 基于zookeeper的远程方法调用&lpar;RMI&rpar;的实现

    采用zookeeper的命名服务,采用不同的目录结构存储不同模块不同服务的rmi的url,使用key来对应不同的服务.同时采用zookeeper解决了单点问题. 当有两个相同的服务注册时,因为采用的是 ...

  3. 栈和队列的面试题Java

    栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...

  4. MyEclipse下JDBC-MySQL配置总结

    原创文章,转载请注明:MyEclipse下JDBC-MySQL配置总结  By Lucio.Yang 新手,初期配置未成功,后将网上的方法几乎全部尝试才弄好,下面的方法全而不简练,希望高手指正. 1. ...

  5. python 列表去重的几种方法

    1 a = [,,,,,,,,,,] a1 = [] for i in a: if i not a1: a1.append(i) else: continue 2 a = [,,,,,,,,,] a1 ...

  6. &lbrack;转帖&rsqb;git命令参考手册

                      git init                                                  # 初始化本地git仓库(创建新仓库) git ...

  7. java通过当前请求得到访问者ip的工具类

    在我们开发的过程中,也许有下面的这样的需求,就是要记录一下每次访问服务器的ip,需要存到数据库,以便以后进行数据分析等... 下面给大家介绍一个通过当前请求得到访问者ip的工具类 IpUtil.jav ...

  8. 【IDEA】【4】遇到的问题

    前言: 1,jar包未导入到项目中 2,报错 cannot resolve symbol 3,左边栏只能看到文件看不到项目结构 4,报错 No valid Maven installation fou ...

  9. Linux command stty

    Linux command stty reference: https://blog.csdn.net/lqxandroid2012/article/details/78929506 [Purpose ...

  10. &period;net解决Xss攻击

    首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ...