题目链接

设可能的答案串为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. Java基础-SSM之mybatis一对一关联

    Java基础-SSM之mybatis一对一关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建husbands和wifes表并建 ...

  2. 函数和常用模块【day06】:模块特殊变量(十四)

    from test import test ''' __mame__ # 当前文件为主文件是等于__main__.用于调用时不执行一些命令 __file__ # 当前文件的路径,相对路径 __cach ...

  3. 手机安全卫士-——Splash总结

    1.在AndroidManifest.xml文件的application中配置,应用的主题:不带标题的主题 android:theme="@android:style/Theme.Black ...

  4. C语言复习---零散补充

    一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...

  5. React JSX基本语法规则

    JSX基本语法规则: 遇到HTML(以 < 开头)标签,就用HTML规则解析: 遇到代码块(以 { 开头),就用JavaScript规则解析. 它允许HTML和JavaScript的混写. 注意 ...

  6. Dubbo学习笔记5:Dubbo整体框架分析

    Dubbo的分层架构 本文将简单介绍Dubbo的分层架构设计,如下图是Dubbo官方的整体架构图: Dubbo官方提供的该架构图很复杂,一开始我们没必要深入细节,下面我们简单介绍下其中的主要模块. 其 ...

  7. ASP.NET批量下载文件

    一.实现步骤 在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹.然后调用 RAR程序,对临时文件夹进行压缩,然后输出到 ...

  8. HDU 1251 统计难题 字符匹配

    题目描述:先说明此题只有一个测试实例,然后输入一系列的单词,以一个回车为结束符,然后输入一个字符串,要你查找以这个字符串为前缀的单词的个数,处理到文件结束. 解题报告:一开始看到这题,竟然直接用暴力去 ...

  9. 关于markdown文件插入图片遇到的小问题和解决办法

    今天用md文件时候发现需要插入图片,以前没做过,所以写下来分享下. 1.先在自己的github上建一个仓库,里面新建个img文件夹存放图片,怎么建仓库可以上网找资料,这里就不详细说明了.建好的仓库如下 ...

  10. Linux中断(interrupt)子系统之五:软件中断(softIRQ)

    转自:http://blog.csdn.net/droidphone/article/details/7518428 软件中断(softIRQ)是内核提供的一种延迟执行机制,它完全由软件触发,虽然说是 ...