12.7 Test

目录

  • 2018.12.7 Test
    • A 序列sequence(迭代加深搜索)
    • B 轰炸bomb(Tarjan DP)
    • C 字符串string(AC自动机 状压DP)
    • 考试代码
      • A
      • C

2018.12.7 Test

题目为2018.1.4雅礼集训。

时间:4.5h
期望得分:0+100+10
实际得分:0+100+10

A 序列sequence(迭代加深搜索)

显然可以每次将最大的数转到第一位,再转到对应的位,所以答案不会超过\(2n-2\)
这其实挺小的,考虑爆搜迭代加深。

注意到每次反转最多只会影响一对数的连续关系(反转位置\(p\)\(p+1\)),所以借此可以求出当前至少还需多少步。利用这个剪枝就可以过了。。

复杂度\(O(能过)\)

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=27;int n,lim,OK,A[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;
}
void DFS(int step,int need)
{if(OK||step+need>lim) return;int p=n;while(A[p]==p) --p;if(!p) {OK=1; return;}
//  for(int p=2; p<=n; ++p)//这种玄学题还是倒着吧...?for(; p>=2; --p){int t=(p<n && std::abs(A[p]-A[p+1])==1)-(p<n && std::abs(A[1]-A[p+1])==1);std::reverse(A+1,A+1+p);DFS(step+1,need+t);std::reverse(A+1,A+1+p);if(OK) break;}
}int main()
{freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);A[0]=-233;for(int T=read(); T--; ){n=read(); int t=0;for(int i=1; i<=n; ++i) A[i]=read();for(int i=1; i<n; ++i) if(std::abs(A[i]-A[i+1])!=1) ++t;for(OK=0,lim=t; ; ++lim)if(DFS(0,t),OK) break;printf("%d\n",lim);}return 0;
}

B 轰炸bomb(Tarjan DP)

缩点,将每个连通分量缩点后的权值设成连通分量大小,那么就是求每个连通块的最长链了。简单DP一下。

另外可以\(O(1)\)将连通分量中的点的出边接到根节点(连通分量代表点)的边表后面去,访问那些点就直接访问根节点好了。这样无需新建一张图。

#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e6+5;int Ans,Enum,ed[N],H[N],nxt[N<<1],to[N<<1],dfn[N],low[N],top,sk[N],bel[N],val[N],f[N];
bool vis[N],ins[N];
char IN[MAXIN],*SS=IN,*TT=IN;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 void AE(int v,int u)
{if(!H[u]) ed[u]=Enum+1;to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
}
void Tarjan(int x)
{static int Index=0;low[x]=dfn[x]=++Index, sk[++top]=x, ins[x]=1;for(int i=H[x],v; i; i=nxt[i])if(!dfn[v=to[i]]) Tarjan(v), low[x]=std::min(low[x],low[v]);else if(ins[v]) low[x]=std::min(low[x],dfn[v]);if(dfn[x]==low[x]){do{int tmp=sk[top--];++val[x], bel[tmp]=x;if(x!=tmp) nxt[ed[x]]=H[tmp], ed[x]=ed[tmp];//, H[tmp]=0;ins[tmp]=0;}while(sk[top+1]!=x);}
}
void DFS(int x)
{int mx=0; vis[x]=1;for(int i=H[x],v; i; i=nxt[i])if((v=bel[to[i]])!=x){if(!vis[v]) DFS(v);mx=std::max(mx,f[v]);}f[x]=val[x]+mx;Ans=std::max(Ans,f[x]);
}int main()
{freopen("bomb.in","r",stdin);freopen("bomb.out","w",stdout);int n=read(),m=read();for(int i=1; i<=m; ++i) AE(read(),read());for(int i=1; i<=n; ++i) bel[i]=i;for(int i=1; i<=n; ++i)if(!dfn[i]) Tarjan(i);for(int i=1; i<=n; ++i)if(!vis[i]&&bel[i]==i) DFS(i);printf("%d\n",Ans);return 0;
}

C 字符串string(AC自动机 状压DP)

1143196-20181210063941390-309797461.png
原题:HDU 6086

考虑没有反回文这一条件,那么将\(n\)个字符串都插入AC自动机,就可以在上面状压DP了(状压匹配了哪几个字符串)。
具体就是,令\(f[i][j][k]\)表示当前为第\(i\)位,当前在AC自动机上的节点\(j\),匹配字符串状态为\(k\),的方案数。转移时,枚举节点\(u\),然后枚举下一步放哪个字符\(c\),然后会跳到一个节点\(v=son[u][c]\)。那么\(f[i][u][k]\)就可以转移到\(f[i+1][v][k|s_v]\),其中\(s_v\)为在\(v\)节点匹配的字符串集合。
(这样当然对啊,虽然只是对\(n\)个串建AC自动机,但每次填一个字符一定会转移到某个节点且仍保持某种匹配状态)
最后答案就是\(\sum_{i=1}^{tot}f[m][i][2^n-1]\)\(tot\)是AC自动机总结点数。

考虑反回文的情况。那么每个串在长\(2m\)的串中出现有四种情况:在前一半出现,在后一半出现,跨越中点且在前一半的部分多,跨越中点且在后一半的部分多。

对于第二种情况,把反串(reverse后再01取反)插入到AC自动机,同样状压DP就好了。

对于第三种情况,我们需要判断每个串\(s\)的每个长度至少为\(|s|\)一半的前缀\(s[1...i]\)判断(注意\(i\)的范围!),反转它后是否能对应\(s[i+1...|s|]\),也就是它是否可以跨越中点。
对每个节点再状压一个状态\(s'_u\),表示以该节点作为中间点(也就是前一半串的结束点)能匹配的字符串集合。最后计算答案时\(s_u\)\(s'_u\)取个并再判断是否等于\(2^n-1\)即可。
如果该串在当前匹配节点\(u\)处可以跨越中点,就加入到\(s'_u\)中去。

对于第四种情况,对反串同情况三一样处理即可。

//15MS  1344K
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod 998244353
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
typedef long long LL;
const int N=6*20*2+7;//6*100*2+7;struct AC_Automaton
{int tot,son[N][2],s1[N],s2[N],fail[N],q[N],f[2][N][(1<<6)+2];void Clear(){tot=0, memset(son,0,sizeof son), memset(fail,0,sizeof fail);memset(s1,0,sizeof s1), memset(s2,0,sizeof s2), memset(f,0,sizeof f);}inline bool Check(char *s,int p,int l){for(int i=p+1; i<l; ++i) if(/*p-i+p+1<0||*/s[i]==s[p-i+p+1]) return 0;return 1;}void Insert(char *s,int l,int id){int x=0;for(int i=0,c,mid=l-1>>1; i<l; ++i)//mid=(l-1)/2 !{if(!son[x][c=s[i]-48]) son[x][c]=++tot;x=son[x][c];if(i>=mid && Check(s,i,l)) s2[x]|=id;}s1[x]|=id;}void Build(){int h=0,t=0;if(son[0][0]) fail[son[0][0]]=0, q[t++]=son[0][0];if(son[0][1]) fail[son[0][1]]=0, q[t++]=son[0][1];while(h<t){int x=q[h++];s1[x]|=s1[fail[x]], s2[x]|=s2[fail[x]];for(int i=0; i<2; ++i)if(son[x][i]) fail[son[x][i]]=son[fail[x]][i], q[t++]=son[x][i];else son[x][i]=son[fail[x]][i];}}void Solve(int n,int m){
//      for(int i=0; i<=tot; ++i) s1[i]|=s1[fail[i]], s2[i]|=s2[fail[i]];int p=1,lim=(1<<n)-1; f[p][0][0]=1;for(int i=1; i<=m; ++i,p^=1)for(int u=0; u<=tot; ++u)for(int k=0,val; k<=lim; ++k){if(!(val=f[p][u][k])) continue;for(int l=0; l<2; ++l){int v=son[u][l],s=k|s1[v];Add(f[p^1][v][s],val);}f[p][u][k]=0;}LL ans=0;for(int u=0; u<=tot; ++u)for(int k=0; k<=lim; ++k)if((k|s2[u])==lim) ans+=f[p][u][k];printf("%d\n",(int)(ans%mod));}
}ac;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;
}int main()
{freopen("string.in","r",stdin);freopen("string.out","w",stdout);static char tmp[105];int n=read(),m=read();for(int i=0,l; i<n; ++i){scanf("%s",tmp), l=strlen(tmp);ac.Insert(tmp,l,1<<i);std::reverse(tmp,tmp+l);for(int j=0; j<l; ++j) tmp[j]^=1;//就算是'0''1',相邻的一个奇数一个偶数也可以直接转啊 ac.Insert(tmp,l,1<<i);}ac.Build(), ac.Solve(n,m);return 0;
}

考试代码

A

自闭。

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=27;int A[N];
char IN[MAXIN],*SS=IN,*TT=IN;inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=='-'&&(f=-1),c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now*f;
}
int Solve1(int n)
{static int B[N];memcpy(B,A,sizeof A);int now=n,ans=0,lim=n; B[0]=-233;while(now!=1){while(B[lim]==now) --lim, --now;if(!lim) break;if(B[1]==now) std::reverse(B+1,B+1+lim), --lim, --now, ++ans;else{int p=1;for(int i=1; i<=lim; ++i) if(B[i]==now) {p=i; break;}std::reverse(B+1,B+1+p), ++ans;}}return ans;
}
bool De=1;
int Solve2(const int n)
{static int f[N][N][N][2];//0:up 1:downmemset(f,0x3f,sizeof f);for(int i=1; i<=n; ++i){f[i][i][A[i]][0]=f[i][i][A[i]][1]=0;for(int j=i+1; j<=n; ++j)if(A[j]==A[i]+j-i) f[i][j][A[i]][0]=0, f[i][j][A[i]][1]=0;else break;for(int j=i+1; j<=n; ++j)if(A[j]==A[i]-j+i) f[i][j][A[j]][1]=0, f[i][j][A[j]][0]=0;else break;}for(int l=1; l<n; ++l){De && printf("\nl:%d\n",l);for(int i=1; i+l<=n; ++i){int j=i+l;for(int x=1; x<=n; ++x){for(int k=i; k<j; ++k){if(x+k+1-i<=n) f[i][j][x][0]=std::min(f[i][j][x][0],f[i][k][x][0]+f[k+1][j][x+k+1-i][0]);if(x+j-k<=n) f[i][j][x][1]=std::min(f[i][j][x][1],f[i][k][x+j-k][1]+f[k+1][j][x][1]);if(x+k+1-i<=n) De && printf("f[%d][%d][%d][%d]=%d\n",i,j,x,0,f[i][j][x][0]);if(x+j-k<=n) De && printf("f[%d][%d][%d][%d]=%d\n",i,j,x,1,f[i][j][x][1]);}}}for(int x=1; x<=n; ++x){f[1][l+1][x][0]=std::min(f[1][l+1][x][0],f[1][l+1][x][1]+1),f[1][l+1][x][1]=std::min(f[1][l+1][x][1],f[1][l+1][x][0]+1);De && printf("f[%d][%d][%d][%d]=%d\n",1,l+1,x,0,f[1][l+1][x][0]);De && printf("f[%d][%d][%d][%d]=%d\n",1,l+1,x,1,f[1][l+1][x][1]);}}return std::min(f[1][n][1][0],f[1][n][1][1]+1);
}int main()
{freopen("sequence.in","r",stdin);freopen("sequence.out","w",stdout);for(int T=read(); T--; ){int n=read();for(int i=1; i<=n; ++i) A[i]=read();int ans=Solve1(n);
//      De=1, printf("ans1:%d ans2:%d\n",ans,Solve2(n));De=0;ans=std::min(ans,Solve2(n));printf("%d\n",ans);}return 0;
}

C

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
#define mod 998244353
typedef long long LL;
const int N=1005;int len[8],s[8][105];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;
}
namespace Subtask1
{int n,m,L,mid,Ans,bit[N];void Recover(int m,int L){for(int i=1; i<=m; ++i) bit[L-i+1]=bit[i]^1;}bool Check(int *s,int l){for(int i=1; i+l-1<=L; ++i)for(int j=1; ; ++j)if(j<=l && s[j]!=bit[i+j-1]) break;else if(j==l) return 1;
//      puts("Failed:"); for(int i=1; i<=l; ++i) printf("%d ",s[i]); puts("");return 0;}void DFS(int x){if(x>m){Recover(m,L);
//          puts("Now:"); for(int i=1; i<=L; ++i) printf("%d ",bit[i]); puts("");for(int i=1; i<=n; ++i)if(!Check(s[i],len[i])) return ;++Ans;return;}bit[x]=0, DFS(x+1), bit[x]=1, DFS(x+1);}void Main(int n,int m){Subtask1::n=n, Subtask1::m=m, L=m<<1;DFS(1), printf("%d\n",Ans);}
}int main()
{freopen("string.in","r",stdin);freopen("string.out","w",stdout);static char tmp[105];int n=read(),m=read();for(int i=1; i<=n; ++i){scanf("%s",tmp+1), len[i]=strlen(tmp+1);for(int j=1; j<=len[i]; ++j) s[i][j]=tmp[j]-'0';}if(m<=17) return Subtask1::Main(n,m),0;return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10093811.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word文档中统计总页数_如何在Google文档中查找页数和字数统计

word文档中统计总页数Whether you’ve been given an assignment with a strict limit or you just like knowing how many words you’ve written, Google Docs has your back. Here’s how to see exactly how many words or pages you’ve typed in your document. 无论您是…

vue 入门notes

文章目录vue一、js基础二、封装缓存三、组件1、组件创建、引入、挂载、使用2、组件间的传值- 父组件主动获取子组件的数据和方法&#xff08;子组件给父组件传值&#xff09;&#xff1a;- 子组件主动获取父组件的数据和方法&#xff08;父组件给子组件传值&#xff09;&#x…

spring集成 JedisCluster 连接 redis3.0 集群

2019独角兽企业重金招聘Python工程师标准>>> spring集成 JedisCluster 连接 redis3.0 集群 博客分类&#xff1a; 缓存 spring 客户端采用最新的jedis 2.7 1. maven依赖&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifact…

火狐浏览器复制网页文字_从Firefox中的网页链接的多种“复制”格式中选择

火狐浏览器复制网页文字Tired of having to copy, paste, and then format links for use in your blogs, e-mails, or documents? Then see how easy it is to choose a click-and-go format that will save you a lot of time and effort with the CoLT extension for Firef…

vscode配置、使用git

文章目录一、下载、配置git二、vscode配置并使用git三、记住密码一、下载、配置git 1、git-win-x64点击下载后安装直接安装&#xff08;建议复制链接用迅雷等下载器下载&#xff0c;浏览器太慢&#xff0c;记住安装位置&#xff09;。 2、配置git环境变量&#xff1a; 右键 此…

BTrace功能

2019独角兽企业重金招聘Python工程师标准>>> BTrace功能 一、背景 在生产环境中可能经常遇到各种问题&#xff0c;定位问题需要获取程序运行时的数据信息&#xff0c;如方法参数、返回值、全局变量、堆栈信息等。为了获取这些数据信息&#xff0c;我们可以…

.NET(c#) 移动APP开发平台 - Smobiler(1)

原文&#xff1a;https://www.cnblogs.com/oudi/p/8288617.html 如果说基于.net的移动开发平台&#xff0c;目前比较流行的可能是xamarin了&#xff0c;不过除了这个&#xff0c;还有一个比xamarin更好用的国内的.net移动开发平台&#xff0c;smobiler&#xff0c;不用学习另外…

如何在Vizio电视上禁用运动平滑

Vizio维齐奥New Vizio TVs use motion smoothing to make the content you watch appear smoother. This looks good for some content, like sports, but can ruin the feel of movies and TV shows. 新的Vizio电视使用运动平滑来使您观看的内容显得更平滑。 这对于某些内容(例…

无服务器架构 - 从使用场景分析其6大特性

2019独角兽企业重金招聘Python工程师标准>>> 无服务器架构 - 从使用场景分析其6大特性 博客分类&#xff1a; 架构 首先我应该提到&#xff0c;“无服务器”技术肯定有服务器涉及。 我只是使用这个术语来描述这种方法和技术&#xff0c;它将任务处理和调度抽象为与…

Enable Authentication on MongoDB

1、Connect to the server using the mongo shell mongo mongodb://localhost:270172、Create the user administrator Change to the admin database: use admindb.createUser({user: "Admin",pwd: "Admin123",roles: [ { role: "userAdminAnyDataba…

windows驱动程序编写_如何在Windows中回滚驱动程序

windows驱动程序编写Updating a driver on your PC doesn’t always work out well. Sometimes, they introduce bugs or simply don’t run as well as the version they replaced. Luckily, Windows makes it easy to roll back to a previous driver in Windows 10. Here’s…

在Windows 7中的Windows Media Player 12中快速预览歌曲

Do you ever wish you could quickly preview a song without having to play it? Today we look at a quick and easy way to do that in Windows Media Player 12. 您是否曾经希望无需播放就可以快速预览歌曲&#xff1f; 今天&#xff0c;我们探讨一种在Windows Media Play…

Vue.js中的8种组件间的通信方式;3个组件实例是前6种通信的实例,组件直接复制粘贴即可看到运行结果

文章目录一、$children / $parent二、props / $emit三、eventBus四、ref五、provide / reject六、$attrs / $listeners七、localStorage / sessionStorage八、Vuex实例以element ui为例。例子从上往下逐渐变复杂&#xff08;后面例子没有删前面的无用代码&#xff0c;有时间重新…

不可思议的混合模式 background-blend-mode

本文接前文&#xff1a;不可思议的混合模式 mix-blend-mode 。由于 mix-blend-mode 这个属性的强大&#xff0c;很多应用场景和动效的制作不断完善和被发掘出来&#xff0c;遂另起一文继续介绍一些使用 mix-blend-mode 制作的酷炫动画。 CSS3 新增了一个很有意思的属性 -- mix-…

如何更改从Outlook发送的电子邮件中的“答复”地址

If you’re sending an email on behalf of someone else, you might want people to reply to that person instead of you. Microsoft Outlook gives you the option to choose a different default Reply address to cover this situation. 如果您要代表其他人发送电子邮件&…

在Windows 7或Vista资源管理器中禁用缩略图预览

If you want to speed up browsing around in explorer, you might think about disabling thumbnail previews in folders. 如果要加快在资源管理器中的浏览速度&#xff0c;可以考虑禁用文件夹中的缩略图预览。 Note that this works in Windows 7 or Vista 请注意&#xf…

mysql 表数据转储_在MySQL中仅将表结构转储到文件中

mysql 表数据转储For this exercise, we will use the mysqldump utility the same as if we were backing up the entire database. 在本练习中&#xff0c;我们将像备份整个数据库一样使用mysqldump实用程序。 Syntax: 句法&#xff1a; mysqldump -d -h localhost -u root -…

lenos快速开发脚手架

2019独角兽企业重金招聘Python工程师标准>>> lenos一款快速开发模块化脚手架&#xff0c; lenos(p为spring boot版本扩展名)一款快速开发模块化脚手架&#xff0c;采用spring bootspringSpringMvcmybatisshiroswaggerehcachequartzfreemarkerlayui技术开发&#xff…

火狐ok谷歌适配_“ OK Google”在锁定手机上的安全性越来越高

火狐ok谷歌适配If you use “OK Google” to invoke the Assistant on your phone, things are about to change. Google is removing the “Unlock with Voice Match” feature, so the Assistant is going to get a lot more secure. 如果您使用“确定Google”在手机上调用助…

angular ng-zorro 用组件自身方的法来重置表单校验

官网文档的API并没有提供对应的重置表单校验函数の说明&#xff0c;在控制台打印this.validateForm&#xff08;校验表单对象&#xff09; 往往我们只关注亮色函数、属性&#xff0c;而这次重置函数藏在__prop__中&#xff01; 激动万分的使用 this.validateForm.reset()&…