某蒟蒻有一个问题
查看原帖
某蒟蒻有一个问题
236416
_stOrz_楼主2021/7/16 23:42
#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;

有区别吗?为啥第一个输出,第二个不输出

2021/7/16 23:42
加载中...