关于查找函数的时间复杂度
查看原帖
关于查找函数的时间复杂度
349824
WsW_花逝爆零人楼主2023/10/7 22:49

据说下面这份代码的search函数时间复杂度是错的,想了想貌似是的。
求助一下search的时间复杂度,并询问如何卡掉

#include<bits/stdc++.h>
using namespace std;

struct node{
	int son[26];
	int fail;
	int cnt;
}trie[2000005];
int tl;

void insert(string s){
	int cur=0;
	for(int i=0;i<s.length();i++){
		int x=s[i]-'a';
		if(!trie[cur].son[x])trie[cur].son[x]=++tl;
		cur=trie[cur].son[x];
	}
	++trie[cur].cnt;
}

void get_fail(){
	queue<int>q;
	for(int i=0;i<26;i++){
		if(trie[0].son[i])q.push(trie[0].son[i]);
	}
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		for(int i=0;i<26;i++){
			if(trie[cur].son[i]){
				trie[trie[cur].son[i]].fail=trie[trie[cur].fail].son[i];
				q.push(trie[cur].son[i]);
			}
			else  trie[cur].son[i]=trie[trie[cur].fail].son[i];
		}
	}
}

int search(string s){
	int ans=0,cur=0;
	for(int i=0;i<s.length();i++){
		int x=s[i]-'a';
		while(cur&&!trie[cur].son[x]){//匹配不上就一直跳到fail指针处 
			cur=trie[cur].fail;
		}
		if(trie[cur].son[x]){//能匹配上就往下走 
			cur=trie[cur].son[x];
			ans+=trie[cur].cnt;
			trie[cur].cnt=0;
		}
	}
	return ans;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int n;
	string s,t;
	cin>>n;
	while(n--){
		cin>>s;
		insert(s);
	}
	get_fail();
	cin>>t;
	cout<<search(t);
	return 0;
}
2023/10/7 22:49
加载中...