虽然帮别人看代码是一件很痛苦的事情,我依然期待诸路神仙的出现

P3879 [TJOI2010] 阅读理解

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)


| 下一页