T1
水题,可是没A,惭愧。
值得一提的是,虽然我忘了kmp,现场制造的kmp因为缺少针对题目的特判挂了,但是现场制造的kmp板子能过字符串板子题..
对..把板子改装了...而且改对了!
1 nx[0]=-1; 2 for(int i=2,j=-1;i<=len;++i){ 3 while(~j&&ch[j+1]!=ch[i]) j=nx[j]; 4 nx[i]=++j; 5 }
T2
也比较水,可是没A,惭愧。
初始化的时候清零犯了低错,死了。改了,A了。
记录一个骚操作,仔细品味发现它非常巧妙
for(register int i=fr[x];i;i=mo[i].pr) { register int y=mo[i].to; if(!dfn[y]) { tarjan(y); low[x]=min(low[x],low[y]); if(low[y]>=dfn[x]&&dfn[y]<=dfn[n])//后一个条件保证了只在n的祖先处触发 { son++; if(x!=1||son>1) cut[x]=1; } } else low[x]=min(low[x],dfn[y]); }
T3
做的很痛苦,改的也很痛苦,因为看不懂题解,只好。。
自主研发:前提:序列抽象为01,枚举断点转化成序列,每个序列把1挪到序列两端可以保证答案不漏
考虑每个1,它挪到左边代价为左边0的个数,右边代价为右边0的个数
所以往0多的方向走不如往少的方向走
一个1,它的哪边0多,在序列上具有单调性
所以就让它们左边0少的去左边,其余去右边
分界线就是0的数量的中点(偶数就是两个中间的0之间,奇数就是中间那个0)
每个断点,O(1)求解,复杂度O(N)