爆内存怎么改进?
查看原帖
爆内存怎么改进?
1380473
ZY_202301005129楼主2024/11/3 12:43

代码参考了《算法竞赛》的操作。

// P3879 [TJOI2010] 阅读理解.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <bits/stdc++.h>
using namespace std;
int n, m;
struct d
{
	bool end;
	int s[26] = {0};
	int num;

};
d s[10001][1001];
int sum[10001] = {0};
void add(int i, string a)
{
	int now = 0;
	for (auto j = a.begin();j != a.end();j++)
	{
		int ch = *j - 'a';
		if (s[i][now].s[ch] == 0)//如果没有存储过字符
			s[i][now].s[ch] = sum[i]++;
		now = s[i][now].s[ch];
		s[i][now].num++;
		if (j + 1 == a.end())
			s[i][now].end = 1;
	}
}
bool find(int i, string a)
{
	int now = 0;
	for (auto j = a.begin();j != a.end();j++)
	{
		int ch = *j - 'a';
		if (s[i][now].s[ch] == 0)return 0;
		now = s[i][now].s[ch];
	}//如果出来了,说明这个字符串在问中一定存在
	if (s[i][now].end == 0)return 0;
	if (s[i][now].num == 0)return 0;
	return 1;
}

int main()
{
	cin >> n;
	for (int i = 1;i <= n;i++)
		sum[i] = 1;
	for (int i = 1;i <= n;i++)
	{
		int s;cin >> s;
		for (int j = 1;j <= s;j++)
		{
			string b;
			char c;
			while ((c = getchar()) == ' ')
				continue;
			b.push_back(c);
			while ((c = getchar()) != ' '&&c!='\n')
				b.push_back(c);
			add(i, b);
		}
	}
	cin >> m;
	while (m--)
	{
		string b;
		cin >> b;
		for (int i = 1;i <= n;i++)
			if (find(i, b))cout << i << " ";
		cout << endl;
	}
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
2024/11/3 12:43
加载中...