#include<bits/stdc++.h>
#define SIZE 1000005
#define w 25
#define F(i,a,j) for(int i=a;i<=j;i++)
using namespace std;
int sum[SIZE],trie[SIZE][w+5],fail[SIZE],root,cnt,id[SIZE];
void insert(string s,int idx)
{
int len=s.size(),p=root,c;
F(i,0,len-1)
{
c=s[i]-'a';
if(trie[p][c]==0) trie[p][c]=++cnt;
p=trie[p][c];
}
id[idx]=p;
}
vector<int>v[SIZE];
void Get_Fail()
{
queue<int>q;
fail[root]=root;
F(i,0,w)
{
if(trie[root][i])
{
q.push(trie[root][i]);
v[root].push_back(trie[root][i]);
}
else trie[root][i]=root;
fail[trie[root][i]]=root;
}
while(!q.empty())
{
int now=q.front();
q.pop();
F(i,0,w)
{
if(trie[now][i])
{
fail[trie[now][i]]=trie[fail[now]][i];
q.push(trie[now][i]);
v[trie[fail[now]][i]].push_back(trie[now][i]);
}
else trie[now][i]=trie[fail[now]][i];
}
}
}
void dfs(int x)
{
//cout<<x<<endl;
for(int i=0;i<v[x].size();i++)
{
dfs(v[x][i]);
sum[x]+=sum[v[x][i]];
}
return;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n;
string s;
cin>>n;
F(i,1,n)
{
cin>>s;
insert(s,i);
}
cin>>s;
Get_Fail();
int p=root;
F(i,0,s.size()-1)
{
p=trie[p][s[i]-'a'];
++sum[p];
}
dfs(root);
F(i,1,n)
cout<<sum[id[i]]<<'\n';
return 0;
}
与
#include<bits/stdc++.h>
#define SIZE 1000005
#define w 25
#define F(i,a,j) for(int i=a;i<=j;i++)
using namespace std;
int sum[SIZE],trie[SIZE][w+5],fail[SIZE],root,cnt,id[SIZE];
void insert(string s,int idx)
{
int len=s.size(),p=root,c;
F(i,0,len-1)
{
c=s[i]-'a';
if(trie[p][c]==0) trie[p][c]=++cnt;
p=trie[p][c];
}
id[idx]=p;
}
vector<int>v[SIZE];
void Get_Fail()
{
queue<int>q;
fail[root]=root;
F(i,0,w)
{
if(trie[root][i])
{
q.push(trie[root][i]);
v[root].push_back(trie[root][i]);
}
else trie[root][i]=root;
fail[trie[root][i]]=root;
}
while(!q.empty())
{
int now=q.front();
q.pop();
F(i,0,w)
{
if(trie[now][i])
{
fail[trie[now][i]]=trie[fail[now]][i];
q.push(trie[now][i]);
v[trie[fail[now]][i]].push_back(trie[now][i]);
}
else trie[now][i]=trie[fail[now]][i];
}
}
}
void dfs(int x)
{
//cout<<x<<endl;
F(i,0,v[x].size()-1)
{
dfs(v[x][i]);
sum[x]+=sum[v[x][i]];
}
return;
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n;
string s;
cin>>n;
F(i,1,n)
{
cin>>s;
insert(s,i);
}
cin>>s;
Get_Fail();
int p=root;
F(i,0,s.size()-1)
{
p=trie[p][s[i]-'a'];
++sum[p];
}
dfs(root);
F(i,1,n)
cout<<sum[id[i]]<<'\n';
return 0;
有区别吗?为啥第一个输出,第二个不输出