Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行时错误,在线判断上的退出代码为6 我在网上的法官做我的C++作业。有m个长度为n的字符串。我需要找到新字符串的最小表达式,然后将其插入trie树中。对于每个字符串,我需要返回第一个相同字符串的“位置号”_C++_Trie_Exit Code - Fatal编程技术网

运行时错误,在线判断上的退出代码为6 我在网上的法官做我的C++作业。有m个长度为n的字符串。我需要找到新字符串的最小表达式,然后将其插入trie树中。对于每个字符串,我需要返回第一个相同字符串的“位置号”

运行时错误,在线判断上的退出代码为6 我在网上的法官做我的C++作业。有m个长度为n的字符串。我需要找到新字符串的最小表达式,然后将其插入trie树中。对于每个字符串,我需要返回第一个相同字符串的“位置号”,c++,trie,exit-code,C++,Trie,Exit Code,以下是我的代码: #include <cstdio> using namespace std; struct trie_node { trie_node * firstSon; trie_node * nextBro; char value; bool isKey; int firstPos; trie_node(char value):firstSon(NULL), nextBro(NULL), value(value), isKe

以下是我的代码:

#include <cstdio>
using namespace std;

struct trie_node
{
    trie_node * firstSon;
    trie_node * nextBro;
    char value;
    bool isKey;
    int firstPos;
    trie_node(char value):firstSon(NULL), nextBro(NULL), value(value), isKey(false), firstPos(-1){}
};

class trie_Tree
{
public:
    trie_Tree();
    int searchStr(char* desStr, int len, int selfPos);  

private:
    trie_node* searchChar(trie_node* fatherNode, char desChar);
    trie_node* root;
};

trie_Tree::trie_Tree()
{
    root = new trie_node('0');
}

int trie_Tree::searchStr(char * desStr, int len, int selfPos)
{
    trie_node* fatherNode = root;
    for (int i=0; i<len; i++)
    {
        fatherNode = searchChar(fatherNode, desStr[i]);
    }
    if (!fatherNode->isKey)
    {
        fatherNode->isKey=true;
        fatherNode->firstPos=selfPos;
    }
    return fatherNode->firstPos;
}

trie_node* trie_Tree::searchChar(trie_node* fatherNode, char desChar)
{
    if (fatherNode->firstSon==NULL)
    {
        fatherNode->firstSon = new trie_node(desChar);
        return fatherNode->firstSon;
    }

    trie_node* travNode = fatherNode->firstSon;
    while (travNode->nextBro!=NULL)
    {
        if (travNode->value==desChar) return travNode;
        travNode=travNode->nextBro;
    }

    if (travNode->value==desChar) return travNode;
    else
    {
        travNode->nextBro = new trie_node(desChar);
        return travNode->nextBro;
    }
}

char* getMinPre(char *s, int _size)
{
    int min=0, trav=1;
    while (trav<_size && min<_size)
    {
        int i;
        for (i=0; i<_size; i++)
        {
            if (s[(min+i)%_size]<s[(trav+i)%_size])
            {
                trav=trav+i+1;
                break;
            }
            else if (s[(min+i)%_size]>s[(trav+i)%_size])
            {
                min=trav;
                trav=trav+1;
                break;
            }
        }
        if (i==_size) break;
    }

    char * result=new char[_size];
    for (int i=0; i<_size; i++)
    {
        result[i]=s[(min+i)%_size];
    }
    return result;
}

int main()
{
    int m, n, result=0;
    scanf("%d %d", &m, &n);

    trie_Tree tt=trie_Tree();

    char* s=new char[n+1];
    for (int i=0; i<m; i++)
    {
        scanf("%s", s);
        s=getMinPre(s, n);
        result = tt.searchStr(s, n, i);
        printf("%d\n", result);
    }
    delete[] s;

    return 0;
}
#包括
使用名称空间std;
结构trie_节点
{
trie_node*firstSon;
trie_node*nextBro;
字符值;
布尔伊斯基;
int firstPos;
trie_节点(char值):firstSon(NULL)、nextBro(NULL)、value(value)、isKey(false)、firstPos(-1){
};
类trie_树
{
公众:
trie_树();
int searchStr(char*desStr、int len、int selfPos);
私人:
trie_节点*searchChar(trie_节点*fatherNode,char desChar);
trie_节点*根;
};
trie_树::trie_树()
{
root=新的trie_节点('0');
}
int-trie_树::searchStr(char*desStr、int-len、int-selfPos)
{
trie_node*父节点=根节点;
对于(int i=0;iisKey)
{
父节点->isKey=true;
父节点->第一个位置=自位置;
}
返回父节点->第一个POS;
}
trie_节点*trie_树::searchChar(trie_节点*fatherNode,char desChar)
{
if(父节点->第一子==NULL)
{
父节点->第一子节点=新节点(描述);
返回父节点->长子;
}
trie_node*travNode=fatherNode->firstSon;
while(travNode->nextBro!=NULL)
{
如果(travNode->value==desChar)返回travNode;
travNode=travNode->nextBro;
}
如果(travNode->value==desChar)返回travNode;
其他的
{
travNode->nextBro=新的trie_节点(desChar);
返回travNode->nextBro;
}
}
char*getMinPre(char*s,int\u大小)
{
int min=0,trav=1;

虽然(trav这是很多代码,但有些东西需要研究:

  • 在主函数中分配
    s
    char*s=new char[n+1];
  • s
    传递到
    char*getMinPre(char*s,int\u size)
  • getMinPre
    分配另一个缓冲区,并返回它,覆盖
    s
    s=getMinPre(s,n);
    (初始
    s
    缓冲区内存泄漏)
  • 这可能在主函数的循环中经常发生,因此可能会耗尽内存。(
    getMinPre
    分配并覆盖指向已分配缓冲区的指针)

    由于这是一个在线判断平台,我建议提出极端测试用例(最小、最大元素、大量迭代)并在本地运行它们


    另外:添加一些调试信息。您甚至可以将它们封装在
    #ifdef
    中,这样您就不必删除它们。

    trie_树
    构造函数中,您使用
    new
    分配动态内存,但我发现您不会在任何地方
    删除该对象。同样,在
    searchChar
    中,您分配一个ot子节点,但从不删除它们。同样在
    getMinPre
    中。所有这些节点都将导致内存泄漏。您释放的唯一内存是
    main()
    中的
    result

    <>在C++中,动态内存管理是一个非常复杂的话题,容易出错,每次分配内存时,代码<>代码<新>代码>,你需要记住在某个地方用“代码>删除”/代码>来重新分配它们。 <>您可以使用很多库,而不是自己管理内存。对于链表,可以考虑<代码> STD::向量<代码>标题>代码> <代码> .<