jz集训 8.11

Day 11

上午 字符串

我发现关于字符串的知识我已经忘得差不多了…

kmp

关于kmp,最重要的就是next失配数组,这也是保证kmp时间复杂度为len(s1)+len(s2)的关键。
对于字符串s: abcab 来说,next数组如下:

snext
a0
b0
c0
a1
b2

代码参考:

void init(){
	int j=0;
	for(int i=2; i<=lb; i++){
		while(j>0 && b[j+1]!=b[i]){
			j=nxt[j];
		}
		if(b[j+1]==b[i]){
			j++;
		}
		nxt[i]=j;
	}
}

匹配的话只需再执行一遍与s2的匹配即可。

void kmp(){
	int j=0;
	for(int i=1; i<=la; i++){
		while(j>0 && b[j+1]!=a[i]){
			j=nxt[j];
		}
		if(b[j+1]==a[i]){
			j++;
		}
		if(j==lb){
			printf("%d\n",i-lb+1);
			j=nxt[j];
		}
	}
}

下午

搜索 贪心啥的…

收获一点小知识:

  • 双向bfs优化是根号的。
  • meet in the middle ->log

几道例题:

ABCDEF

在这里插入图片描述
移项,发现原式可化为:
a b + c = d ( e + f ) ab+c=d(e+f) ab+c=d(e+f)
我们 O ( n 3 ) O(n^3) O(n3)枚举 a b + c ab+c ab+c结果计录下来,再枚举 d ( e + f ) d(e+f) d(e+f),判断是否存在。

不同路径数

在这里插入图片描述
bfs从A点开始搜索,将路径长为 L 2 \frac{L}{2} 2L的点x处理出来,cnt1[x]++。
同理,从B点开始搜索,将路径长为 L 2 \frac{L}{2} 2L的点y处理出来,cnt2[y]++。
枚举每个点, a n s = ∑ i = 1 n c n t 1 [ i ] × c n t 2 [ i ] ans=\sum\limits_{i=1}^{n}cnt1[i]\times cnt2[i] ans=i=1ncnt1[i]×cnt2[i]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值