4分,但是手造几组数据都是对的?
查看原帖
4分,但是手造几组数据都是对的?
341373
Autofreeze楼主2021/1/1 11:13
#include<bits/stdc++.h>
#define N 201001
#define re register
#define MAX 2001
#define inf 1e18
#define eps 1e-10
using namespace std;
typedef long long ll;
typedef double db;
const ll mod=19930726;
inline void read(re ll &ret)
{
    ret=0;re char c=getchar();re bool pd=false;
    while(!isdigit(c)){pd|=c=='-';c=getchar();}
    while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c&15);c=getchar();}
    ret=pd?-ret:ret;
    return;
}
ll n,trie[N][26],tot,b[N],nxt[N],cnt[N];
vector<char>v[N];
char s[N*26];
inline void insert(re ll pos)
{
	re ll p=0;
	for(re int i=0;i<v[pos].size();i++)
	{
		re ll c=v[pos][i]-'a';
		if(!trie[p][c])
			trie[p][c]=++tot;
		p=trie[p][c];
	}
	b[pos]=p;
	return;
}
stack<ll>st;
inline void bfs()
{
	queue<ll>q;
	for(re int i=0;i<26;i++)
		if(trie[0][i])
			q.push(trie[0][i]);
	while(!q.empty())
	{
		re ll ver=q.front();
		q.pop();
		st.push(ver);
		for(re int i=0;i<26;i++)
		{
			if(!trie[ver][i])
				trie[ver][i]=trie[nxt[ver]][i];
			else
			{
				nxt[trie[ver][i]]=trie[nxt[ver]][i];
				q.push(trie[ver][i]);
			}
		}
	}
	return;
}
inline void work()
{
	re ll len=strlen(s+1),p=0;
	for(re int i=1;i<=len;i++)
	{
		re ll c=s[i]-'a';
		p=trie[p][c];
		cnt[p]++;
	}
	return;
}
int main()
{
	read(n);
	for(re int i=1;i<=n;i++)
	{
		re char c=getchar();
		while(c>='a'&&c<='z')
		{
			v[i].push_back(c);
			c=getchar();
		}
		insert(i);
	}
	bfs();
	scanf("%s",s+1);
	work();
	while(!st.empty())
	{
		re ll ver=st.top();
		st.pop();
		cnt[nxt[ver]]+=cnt[ver];
	}
	for(re int i=1;i<=n;i++)
		printf("%lld\n",cnt[b[i]]);
    exit(0);
}

https://www.luogu.com.cn/record/44479965

2021/1/1 11:13
加载中...