传送门

分析

考场上想到了先枚举p的长度,在枚举这个长度的所有子串,期望得分40~50pts,但是最终只得了20pts,这是因为我写的代码在验证中总是不断删除s'中的第一个p,而这种方式不能解决形如ababaa的字符串。于是我们考虑满分做法。设dp[i][j]表示在当前的p的情况下s的[i,j]位置是否满足。满足是指这一段区间只由p构成或者一部分只由p构成,另一部分则是p的前缀。对于位置j的字符可能有两种情况:

1.和之后数个字符拼成一段,转移:

dp[i][j]|=(dp[i][j-1]&(s[j]==p[(j-i)%len+1]))。

2.和之前的一段字符拼在一起,中间已经有k个p,转移:

dp[i][j]|=(dp[i][j-k*len]&dp[j-k*len+1][j])。

然后我们使用记忆化搜索转移即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
const int inf = 1e9+;
int dp[][],n,m,cnt,len;
char s[],t[],ans[];
inline int dfs(int le,int ri){
if(le>ri)return ;
if(dp[le][ri]!=-)return dp[le][ri];
dp[le][ri]=;
if(dfs(le,ri-)&&s[ri]==t[(ri-le)%len+])dp[le][ri]|=;
for(int i=ri-len;i>=le;i-=len)
if(dfs(le,i)&&dfs(i+,ri))dp[le][ri]|=;
return dp[le][ri];
}
inline void getmin(){
if(cnt>len){
for(int i=;i<=len;i++)ans[i]=t[i];
cnt=len;
return;
}
for(int i=;i<=cnt;i++)
if((ans[i]-'')<(t[i]-''))return;
else if((ans[i]-'')>(t[i]-''))break;
for(int i=;i<=cnt;i++)ans[i]=t[i];
}
int main(){
int i,j,k,T;
scanf("%d",&T);
while(T--){
cnt=inf;
scanf("%s",t);
n=strlen(t);
for(i=;i<=n;i++)s[i]=t[i-];
for(i=;i<=min(n,cnt);i++)
if(!(n%i))for(j=;j+i-<=n;j++){
memset(dp,-,sizeof(dp));m=i;
for(k=;k<=i;k++)t[k]=s[j+k-];
len=i;if(dfs(,n))getmin();
}
for(i=;i<=cnt;i++)cout<<ans[i];
puts("");
}
return ;
}

ZROI2018提高day1t3的更多相关文章

  1. 正睿OI 提高 Day1T3 ZYB玩字符串(DP)

    题目链接 设可能的答案串为p,长为len.p一定是s的一个子串且len|n. 虽然一些p在s中可能被断成若干段,但删掉其中的若干段后,这段区间一定会被全部消掉. 于是枚举p后,可以用f[i][j]表示 ...

  2. ZROI2018提高day9t1

    传送门 分析 我们首先想到的自然是根据大小关系建图,在这之后我们跑一遍拓扑排序 但是由于l和r的限制关系我们需要对传统的拓扑排序做一些改变 我们考虑将所有入度为0且现在的拓扑序号已经大于等于l的点放入 ...

  3. ZROI2018提高day6t2

    传送门 分析 将所有字母分别转化为1~26,之后将字符串的空位补全为0,?设为-1,我们设dp[p][c][le][ri]表示考虑le到ri个字符串且从第p位开始考虑,这一位最小填c的方案数,具体转移 ...

  4. ZROI2018提高day6t1

    传送门 分析 我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚 ...

  5. ZROI2018提高day5t3

    传送门 分析我们可以根据性质将这个序列构造成一个环:0,a[1~n],0,a[n~1] 这中间的0是为了起间隔作用的. 我们又知道b[i]=a[i-1]^a[i+1] c[i]=b[i-1]^b[i+ ...

  6. ZROI2018提高day5t2

    传送门 分析 考场上傻了,写了个树剖还莫名weila...... 实际就是按顺序考虑每个点,然后从他往上找,一边走一边将走过的边染色,如果走到以前染过色的边就停下.对于每一个a[i]的答案就是之前走过 ...

  7. ZROI2018提高day5t1

    传送门 分析 我们不难将条件转换为前缀和的形式,即 pre[i]>=pre[i-1]*2,pre[i]>0,pre[k]=n. 所以我们用dp[i][j]表示考虑到第i个数且pre[i]= ...

  8. ZROI2018提高day4t3

    传送门 分析 我们假设如果一个点是0则它的值为-1,如果一个点是1则值为1,则一个区间的答案便是max(pre[i]+sur[i]),这里的pre[i]表示此区间i点和它之前的的前缀的最大值,sur[ ...

  9. ZROI2018提高day4t2

    传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...

随机推荐

  1. listening 1

    It was regrettable that such great issues had to be the thrust and parry of a general election. But ...

  2. Agc007_C Pushing Balls

    传送门 题目大意 在一条直线上有$N$个球和$N+1$个洞,每两个球之间有一个洞,每两个洞之间有一个球,最左端和最右端都是洞,其中产生的$2N$个间隔满足从左到右是等差数列.你每次随机选择一个未被推进 ...

  3. SQL夯实基础(五):索引的数据结构

    数据量达到十万级别以上的时候,索引的设置就显得异常重要,而如何才能更好的建立索引,需要了解索引的结构等基础知识.本文我们就来讨论索引的结构. 二叉搜索树:binary search tree 1.所有 ...

  4. webpack里CommonJS的require与ES6 的module.exports加载模块有何不同

    只需明白commonjs的规则即可,import会被转化为commonjs格式的,babel默认会把ES6的模块转化为commonjs规范的. import vue from 'vue'; //等价于 ...

  5. Word 2007 如何设置正文第一页----目录显示正文从第一页开始

    最近学校里开始要求写论文了,其中有个目录中的页码都不是从第一页开始的,毕竟前面还有封面.中英文摘要.目录等,所以正文内容就不是从第一页开始的了,但是很多的书上所有正文都是从第一页开始的,我的论文如何才 ...

  6. 媒体查询ipad,pc端

    媒体查询 /* 判断ipad */ @media only screen and (min-device-width : 768px) and (max-device-width : 1024px){ ...

  7. poj 3421 X-factor Chains——质因数分解

    题目:http://poj.org/problem?id=3421 记忆化搜索竟然水过去了.仔细一想时间可能有点不对,但还是水过去了. #include<iostream> #includ ...

  8. hibernate 延长加载范围

    1. 关闭延迟加载功能 lazy="false"2.修改抓取策略 fetch="join"直接查询关联数据,一个联接查询搞定3.使用Hibernate对象的in ...

  9. RPC: program not registered (ZT)

    When we trying to use a particular RPC  program, below may indicate that rpcbind is not running or t ...

  10. Sandbox简介和路径获取

    一.简介 iOS的沙盒机制,每个应用只能访问自己应用目录下的文件.iOS应用产生的内容,如文件.缓存内容等都必须存储在自己的沙盒内.默认情况下,每个沙盒含有3个文件夹:Documents, Libra ...