我正在研究this问题,我用trie解决了它。它适用于我的计算机上的测试用例(使用GNU C ++ 4.8.4编译器),但它在Codeforces Judge和Ideone for C ++ 11(G ++ 5.1)上给出了分段错误(运行时错误11)。事实上,对于相同的测试用例,它在Ideone上的C ++ 4.3.2中运行良好
2 3
a
b
这是我的代码。
#include <bits/stdc++.h>
using namespace std;
typedef struct node
{
int status;
int visited;
struct node *children[26];
}node;
node *gen_node()
{
node *newnode=new node();
newnode->status=0;
newnode->visited=0;
int i=0;
for(i=0;i<26;i++)
newnode->children[i]=NULL;
}
void insert(node *root,string s)
{
int n=s.size();
int i;
for(i=0;i<n;i++)
{
if(root->children[s[i]-'a']==NULL)
{
root->children[s[i]-'a']=gen_node();
}
root=root->children[s[i]-'a'];
}
}
void dfs(node *root)
{
root->visited=1;
int flag=0,i;
for(i=0;i<26;i++)
{
if(root->children[i]!=NULL && (root->children[i])->visited==0)
{
dfs(root->children[i]);
flag=1;
}
}
if(flag==0)
{
root->status=0;
}
else
{
root->status=0;
for(i=0;i<26;i++)
{
if(root->children[i]!=NULL)
{
root->status=(root->status)|(!((root->children[i])->status));
}
}
}
}
int main()
{
int n,k;
cin>>n>>k;
node *root=gen_node();
int i;
for(i=0;i<n;i++)
{
string s;
cin>>s;
insert(root,s);
}
dfs(root);
if(root->status==0)
{
cout<<"Second"<<endl;
}
else
{
int flag=0;
for(i=0;i<26;i++)
{
if(root->children[i]!=NULL)
{
if((root->children[i])->status==1)
{
flag=1; //root has atleast one losing strategy
}
}
}
if(flag==0)
{
if(k%2==0)
{
cout<<"Second"<<endl;
}
else
{
cout<<"First"<<endl;
}
}
else
{
cout<<"First"<<endl;
}
}
return 0;
}
我曾尝试在Ideone上调试(无法使用gdb :(),并发现segfault在insert()函数中发生(通过注释和取消注释)。
if(root->children[s[i]-'a']==NULL)
{
root->children[s[i]-'a']=gen_node();
}
我不确定这是怎么发生的。任何人都可以帮助我吗?