代码参考了《算法竞赛》的操作。
// 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 文件