关于此题该如何优化空间
查看原帖
关于此题该如何优化空间
601236
_WHITE_NIGHT_楼主2022/10/4 20:47

本人按照常规字典树写法发现:会爆空间......

(只能过前9个点)

于是打算优化一下......

下面是本人还没有优化完的代码.....(不知道该怎么写了......)

#include<bits/stdc++.h>
using namespace std;

int n,trie[500010][28],l,cnt,m,lett[28][500010],num[28];
string ipt;

void insert(string s,int x)
{
	int pos = 0,c;
	for(int i = 0;i < s.length();i++)
	{
		c = s[i] - 'a';
		if(!trie[pos][c]) trie[pos][c] = ++cnt;
		pos = trie[pos][c];
	}
	lett[c][++num[c]] = x;
}

void find(string s)
{
	int pos = 0,c;
	for(int i = 0;i < s.length();i++)
	{
		c = s[i] - 'a';
		if(!trie[pos][c])
		{
			puts("");
			return;
		}
		pos = trie[pos][c];
	}
	for(int i = 1;i <= num[c];i++)
		printf("%d ",lett[c][i]);
	puts("");
}

int main()
{
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
	{
		scanf("%d",&l);
		while(l--)
		{
			cin >> ipt;
			insert(ipt,i);
		}
	}
	scanf("%d",&m);
	for(int i = 1;i <= m;i++)
	{
		cin >> ipt;
		find(ipt);
	}
}

其中,新添加的lett是用于存储答案的,num是用于存储对应字符结尾的答案个数的

求大佬指教

2022/10/4 20:47
加载中...