记录编号 261467 评测结果 AAAAAAAAAA
题目名称 [SCOI 2012] 喵星球上的点名 最终得分 100
用户昵称 Gravatar小一米 是否通过 通过
代码语言 C++ 运行时间 1.515 s
提交时间 2016-05-17 18:52:27 内存使用 48.55 MiB
显示代码纯文本
#include"bits/stdc++.h"
#define M 1000006
#define LL long long
using namespace std;
int n,m,root=1,cnt=1;
int fail[M],len[2][M/5],vis[M],sum[M],ans[M],hash[M>>1];
map<int,int>trie[M];
vector<int> name[2][M/5],son[M],ID[M];
int in()
{
	int t=0;char ch=getchar();
	while (!isdigit(ch)) ch=getchar();
	while (isdigit(ch)) t=(t<<1)+(t<<3)+ch-48,ch=getchar();
	return t;
}
void insert(int len,int id)
{
	int x,now=root;
	for (int i=0;i<len;i++)
	{
		x=in();
		if (!trie[now][x])
			trie[now][x]=++cnt,
			son[now].push_back(x);
		now=trie[now][x];
	}
	ID[now].push_back(id);
	hash[id]=now;
}
void build()
{
	queue<int>q;
	q.push(root);
	while(!q.empty())
	{
		int k=q.front();q.pop();
		for (int i=0;i<son[k].size();i++)
		{
			int tmp=fail[k],x=trie[k][son[k][i]];
			while (tmp&&!trie[tmp][son[k][i]]) tmp=fail[tmp];
			if (k!=root&&tmp) fail[x]=trie[tmp][son[k][i]];
			else fail[x]=root;
			q.push(x);
		}
	}
}
main()
{
	freopen("wtfname.in","r",stdin);
	freopen("wtfname.out","w",stdout);
	n=in();m=in();
	for (int i=1;i<=n;i++)
		for (int j=0;j<2;j++)
		{
			len[j][i]=in();
			for (int k=1;k<=len[j][i];k++)
				name[j][i].push_back(in());
		}
	for (int i=1;i<=m;i++)
		insert(in(),i);
	build();
	for (int i=1;i<=n;i++)
		for (int j=0;j<2;j++)
		{
			int now=root,tmp;
			for (int k=0;k<len[j][i];k++)
			{
				while (now&&!trie[now][name[j][i][k]]) now=fail[now];
				if (!now) now=root;
				else now=trie[now][name[j][i][k]];
				tmp=now;
				for (;tmp!=root;tmp=fail[tmp])
					if (ID[tmp].size()&&vis[tmp]!=i)
						vis[tmp]=i,
						ans[i]+=ID[tmp].size(),
						sum[tmp]++;
			}
		}
	for (int i=1;i<=m;i++) printf("%d\n",sum[hash[i]]);
	for (int i=1;i<=n;i++) printf("%d ",ans[i]);
}