题目链接

设可能的答案串为p,长为len。p一定是s的一个子串且len|n。

虽然一些p在s中可能被断成若干段,但删掉其中的若干段后,这段区间一定会被全部消掉。

于是枚举p后,可以用f[i][j]表示区间[i,j]是否合法。len不需要整除区间长度,多余的部分要匹配p的前缀(匹配什么后缀啊,大不了从前面开始)。

f[i][j]可以由j-1拼,即 \(f[i][j]|=f[i][j-1]\ \&\&\ s[j]==p[(l-1)/l+1] (l=j-i+1)\)。

也可以是j和前面构成了可消除的串,之后可以跳过这些串继续匹配,即 \(f[i][j]|=f[i][j-k*len]\ \&\&\ f[j-k*len+1][j]\)。

第二种转移的上界是\(O(\frac{n}{len})\)的。

复杂度约是\(O(\sum_{len|n}(n-len+1)*n^2*n/len)=O(n^4)\)。对p判一下重,再判字符集合法性,跑的就很快了。

//285ms	17216kb(string怎么那么快。。)
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod (20000000)
const int N=205; int n,q[N*N],cnt[233],cnt2[233];
bool vis[20000001],f[N][N];
char s[N],p[N],ans[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int Hash(int l)
{
int x=0;
for(int i=1; i<=l; ++i) x=(x*37+p[i]-'A')%mod;
return x;
}
void Update()
{
if(ans[1]=='{') for(int i=1; i<=n; ++i) ans[i]=p[i];
else
{
for(int i=1; i<=n; ++i) if(p[i]>ans[i]) return;
for(int i=1; i<=n; ++i) ans[i]=p[i];
}
}
bool Solve(int len)
{
for(int i=1; i<=n; ++i) f[i][i]=s[i]==p[1];
for(int l=2; l<=n; ++l)
{
for(int i=1,j; (j=i+l-1)<=n; ++i)
{
f[i][j]=0;
if(f[i][j-1]&&s[j]==p[(l-1)%len+1]) f[i][j]=1;
else
for(int k=1; j>=i+k*len; ++k)
if(f[i][j-k*len]&&f[j-k*len+1][j]) {f[i][j]=1; break;}
}
}
return f[1][n];
} int main()
{
for(int T=read(); T--; )
{
ans[1]='{'; int t=0;
scanf("%s",s+1), n=strlen(s+1);// cin>>s; s=""+s;
for(int i=1; i<=n; ++i) ++cnt[s[i]];
for(int len=1; len<=n; ++len)
if(!(n%len))
{
for(int l=0,val; l+len<=n; ++l)
{
for(int i=1; i<=len; ++i) p[i]=s[l+i];// p=s.substr(l+1,l+len) for(int i=1; i<=len; ++i) ++cnt2[p[i]];
bool f=1;
for(int i='a'; i<='z'; ++i) if(cnt2[i]&&cnt[i]%cnt2[i]) {f=0; break;}//cnt2!=0。。
for(int i=1; i<=len; ++i) --cnt2[p[i]];
if(!f) continue; if(!vis[val=Hash(len)]) vis[val]=1, q[++t]=val;
else continue; if(Solve(len)) Update();
}
if(ans[1]!='{') {ans[len+1]='\0', puts(ans+1); break;}
}
for(int i=1; i<=t; ++i) vis[q[i]]=0;
for(int i=1; i<=n; ++i) --cnt[s[i]];
}
return 0;
}

正睿OI 提高 Day1T3 ZYB玩字符串(DP)的更多相关文章

  1. 正睿OI提高组十连测 day1 总结

    可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...

  2. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

  3. 正睿OI国庆DAY2:图论专题

    正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...

  4. 正睿OI国庆day1

    正睿OI国庆day1 T1 \[ S_n=1*S_{n-1}+1*F_{n-1}+1*F_{n-2}+1*f_{n-1}+1*f_{n-2} \] \[ F_{n}=0*S_{n-1}+1*F_{n- ...

  5. 正睿OI集训游记

    什么嘛....就是去被虐的... 反正就是难受就是了.各种神仙知识点,神仙题目,各式各样的仙人掌..... 但是还是学会了不少东西...... 应该是OI生涯最后一次集训了吧.... 这次的感言还是好 ...

  6. 『正睿OI 2019SC Day8-Day17』

    于是就迎来\(10\)天的自闭考试了,每天写点小总结吧. Day8 第一天就很自闭啊,考题分别是数学题+建模题+图论. 前两道题都没有什么算法,但是难度还是有的,于是就做不太出来,特别是第一题.第二题 ...

  7. [JZOJ6347]:ZYB玩字符串(DP+记忆化搜索)

    题目描述 $ZYB$获得了一个神秘的非空字符串$p$. 初始时,串$S$是空的. $ZYB$会执行若干次这样的操作: $1.$选取$S$中的一个任意的位置(可以是最前面或者最后面) $2.$在这个位置 ...

  8. [JZOJ6347] 【NOIP2019模拟2019.9.8】ZYB玩字符串

    题目 题目大意 有一个字符串\(p\).一开始字符串\(s\)为空串. 接下来进行若干次操作:在\(s\)的某个空隙中插入\(p\). 给出操作后的\(s\),问长度最小的\(p\). 思考历程 感觉 ...

  9. 【正睿oi省选十连测】第一场

    四小时写了两个暴力??自闭 [原来这就是神仙们的分量Orz rank 56/75 可以说是无比垃圾了 下周目标:进步十名?[大雾 T1 题意:有n个点的图 点有点权Ai 也有点权Bi = A_1 + ...

随机推荐

  1. Training (deep) Neural Networks Part: 1

    Training (deep) Neural Networks Part: 1 Nowadays training deep learning models have become extremely ...

  2. Rime中州韵导入QQ五笔词库

    过程记录如下: 1.在QQ五笔中导出QQ五笔系统词库 2.使用「深蓝词库转换」转换QQ五笔系统词库,输入源修改为”五笔86版“,输出方式修改为Rime中州韵-五笔. 3.在Ubuntu中打开Termi ...

  3. python 基础 元组()

    # 元组 应用场景 # 尽管 Python的列表中可以存储不同类型的数据 # 但是在开发中,更多的应用场景是 # 1.列表存储相同类型的数据 # 2.通过迭代遍历,在循环体内部,针对列表中的每一项元素 ...

  4. Sublime Text 3 绿色汉化版 x64

    之前做了<Sublime Text 2 绿色汉化版 x64>,这些天抽空做了下 ST3 的汉化.. 果然我没有任何理由爱上 ST3,不仅pojie麻烦,而且汉化更麻烦,菜单字符长度做了限制 ...

  5. 【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法

    [题目]#6392. 「THUPC2018」密码学第三次小作业 / Rsa [题意]T次询问,给定正整数c1,c2,e1,e2,N,求正整数m满足: \(c_1=m^{e_1} \ \ mod \ \ ...

  6. 20155212 2016-2017-2 《Java程序设计》第6周学习总结

    20155212 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Chapter10 输入串流为java.io.InputStream,输出串流为java.i ...

  7. laravel一个页面两个表格分页处理

    关键是看懂laravel自带的 paginate() 方法. 在Builder.php文件(项目名称/laravel/vendor/laravel/framework/src/Illuminate/D ...

  8. HTTP Methods

    简介 HTTP 定义了一组请求方法,以表明要对给定资源执行的操作.指示针对给定资源要执行的期望动作, 虽然他们也可以是名词,但这些请求方法有时被称为HTTP动词.每一个请求方法都实现了不同的语义,但一 ...

  9. 自己动手开发Socks5代理服务器

    一.Socks5协议简介 socks5是基于传输层的协议,客户端和服务器经过两次握手协商之后服务端为客户端建立一条到目标服务器的通道,在传输层转发TCP/UDP流量. 关于socks5协议规范,到处都 ...

  10. 记webpack下引入vue的方法(非.vue文件方式)

    直接script引入下载静态的vue.js文件则最后用copy-webpack-plugin复制到一样的目录即可 使用npm安装的vue无法直接用 import vue from "vue& ...