LeavingZzz @ 2020-02-23 09:28:21
非常感谢您点了进来
阅读理解
基本思路就是把文章看成单词的集合,用Trie存储文章,使用bitset卡空间记录;
但是我似乎天生被字符串克....不知道哪里错了
车祸现场
已经测试过全部单词文章是小写字母组成
谢谢您的帮助^_^
Code
#include<cstdio>
#include<algorithm>
#include<bitset>
#include<cstring>
#include<iostream>
using namespace std;
int Trie[500007][26];
bitset <1007> book[500007];
char s[27];
int N,M,all;
inline void Insert(int x)
{
int p=0,t;
for(int i=0;s[i];i++)
{
t=s[i]-'a';
if(Trie[p][t]==0)
Trie[p][t]=++all;
p=Trie[p][t];
}
book[x][p]=1;
return ;
}
inline void check()
{
int p=0,t;
for(int i=0;s[i];i++)
{
t=s[i]-'a';
if(Trie[p][t]==0)
{
printf("\n");
return ;
}
p=Trie[p][t];
}
bool flag=false;
for(int i=1;i<=N;i++)
{
if(book[i][p])
printf("%d ",i);
}
printf("\n");
return ;
}
int main()
{
scanf("%d",&N);
int x;
for(int i=1;i<=N;i++)
{
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
scanf("%s",s);
Insert(i);
}
}
scanf("%d",&M);
for(int i=1;i<=M;i++)
{
scanf("%s",s);
check();
}
return 0;
}
非常谢谢您!
by C20203030 @ 2020-02-23 09:31:54
我(也许)知道了
scanf("%s")的原理:如果s一开始是aaaa,你读入bb,结果是bbaa,所以你的循环终止条件就出了问题
by C20203030 @ 2020-02-23 09:32:30
你可以试试,虽然我只是口胡
by LeavingZzz @ 2020-02-23 09:34:39
@C20203030 谢谢您,我调试看一下(在线IDE
by cnyzz @ 2020-02-23 09:36:41
@ShadderLeave 字符串建议用cincout
by LeavingZzz @ 2020-02-23 09:38:18
@C20203030
by LeavingZzz @ 2020-02-23 09:41:28
@菜鸟一只 谢谢(但是我仍然爆0...)
by LeavingZzz @ 2020-02-23 09:44:15
窝第一个测试点错误信息是出现了空格(ASCII32)..但是我怎么也搞不清楚哪里的空格
by George1123 @ 2020-02-23 09:44:36
@ShadderLeave 字符串建议用scanf和printf
by George1123 @ 2020-02-23 09:45:29
可惜你的AC自动机的根节点不是1,要不然我会很乐意帮你的。
by LeavingZzz @ 2020-02-23 09:45:53
@♗Wendigo♝ 谢谢您(但是我两样全试过了qwq)