您的位置:首页 > 其它

Phone List--POJ 3630

2010-07-22 20:40 369 查看
1、题目类型:字符串、字典树、排序查找。

2、解题思路:找寻字符串的字串。

3、注意事项:trie树Insert()时后继数组的更新,注意考虑对比当前数据和字典中数据长、短、相等这三种情况,注意控制静态开辟结构体数组的长度。

4、实现方法:(trie树:Memory: 26108K、Time: 641MS)

#include<iostream>
#include<string>
using namespace std;

struct Trie
{
bool end;
Trie *nxt[10];
};

Trie root,Arr[600000];
int num;
bool flag;

void Insert(char str[])
{
Trie *Current=&root;
int i;
for(i=0;i<strlen(str);i++)
{
if(Current->nxt[str[i]-'0']==NULL)
{
Current->nxt[str[i]-'0']=&Arr[num++];
//当前比字典中数长
if(Current->end)
flag=1;
}
Current=Current->nxt[str[i]-'0'];
}

//当前和字典中数相等
if(i==strlen(str)&&Current->end)
flag=1;
Current->end=true;

//当前比字典中数短
for(int j=0;j<10;j++)
{
if(Current->nxt[j]!=NULL)
{
flag=1;
break;
}
}
}

int main()
{
int i,j,k,n,m;
char str[10010];
cin>>n;
for(i=0;i<n;i++)
{
flag=0;
num=0;
root.end=false;
memset(Arr,0,sizeof(Arr));

for(k=0;k<10;k++)
root.nxt[k]=NULL;
cin>>m;
for(j=0;j<m;j++)
{
scanf("%s",str);
if(!flag)
Insert(str);
}
if(!flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}


5、实现方法:(排序查找:Memory: 836K、Time: 391MS)

#pragma warning (disable:4786)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

vector<string>v;

bool Match(string a,string b)
{
int i=0;
while(a[i]!='\0' && b[i]!='\0')
{
if(a[i]==b[i])
i++;
else
return 0;
}
return 1;
}

int main()
{
int t,n,i;
bool flag;
cin>>t;
string tmp;
while(t--)
{
v.clear();
cin>>n;
while(n--)
{
cin>>tmp;
v.push_back(tmp);
}
sort(v.begin(),v.end());
i=0; flag=0;
while(i<v.size()-1 && !flag)
{
flag=Match(v[i],v[i+1]);
i++;
}
if(flag)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: