- 子串查找
- 答案
- @ 2024-5-29 17:02:10
答案≠题解
我想写个题解(题解区里的题解思路太干巴了),但我这个题是随手写的,没认真(因为太简单了)所以代码很乱,加注释也不知道怎么加,也没有模块化,胡成一团,怕大家不能看懂代码,所以就发个答案好了。
#include<iostream>
#define P 307
using namespace std;
int f[int(1e6)];
int main(){
	string a{"0zyzyzyz"},b{"0zyz"};
	cin>>a>>b;
	int lena=a.size(),lenb=b.size();
	a='0'+a;
	b='0'+b;
	f[1]=a[1];
	for(int i(2);i<=lena;i++)
		f[i]=f[i-1]*P+a[i];
	int fb(b[1]);
	for(int i(2);i<=lenb;i++)
		fb=fb*P+b[i];
	int p=1;
	for(int i(1);i<=lenb;i++)
		p*=P;
	int sum(0);
	for(int i(1);i<=lena-lenb+1;i++){
		int x=i;
		int y=x+lenb-1;
		if(fb==f[y]-f[x-1]*p)
			sum++;
	}
	cout<<sum;
}
里面有些很废物的东西,纯属写着玩(比如字符串的初始化),反正能过就行了。随便写的,写得跟坨屎一样。所以就不放题解处了。而且这个牌面很乱,也没有分模块,就是简单说一下,本题就下面几个事,莽就完了:
搞个a的前缀和哈希
把b的哈希搞出来
把p搞出来
推一下公式(不用背,我自己花了四十来秒就推出来了,真的不用背),给大家贴一下:
p是定值,就是上面说的把p搞出来,因为b的长度是固定的嘛。
最后累加一下,套公式,b的哈希值如果等于就sum++,最后输出sum。
以上搞法时间复杂度:O(2lena+lenb),也就是一次级,才,肯定能过。
0 comments
  
  No comments so far...
            Information
- ID
- 251
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- (None)
- # Submissions
- 98
- Accepted
- 18
- Uploaded By
 
      