据说下面这份代码的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;
}