jz集训 8.11

Day 11

上午 字符串

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

kmp

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

s next
a 0
b 0
c 0
a 1
b 2

代码参考:

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

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

不同路径数

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章