首页 > 代码库 > 前缀匹配
前缀匹配
Problem B
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 14 Accepted Submission(s) : 12
Examples: Assume an alphabet that has symbols {A, B, C, D}
The following code is immediately decodable:
A:01 B:10 C:0010 D:0000
but this one is not:
A:01 B:10 C:010 D:0000 (Note that A is a prefix of C)
#include<cstring>
char s[1000][100];
int n;
inline bool check()
{
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
{
bool flag = false;
int l1 = strlen(s[i]);
int l2 = strlen(s[j]);
for (int k = 0; k < l1 && k < l2; k++)///比strstr()要快一点
if (s[i][k] != s[j][k])
{
flag = true;
break;
}
if (!flag) return false;
}
return true;
}
int main(void)
{
int cas = 0;
while (gets(s[0]))
{
for (n = 1;; n++)
{
gets(s[n]);
if (s[n][0] == ‘9‘)
break;
}
if (check()) printf("Set %d is immediately decodable\n", ++cas);
else printf("Set %d is not immediately decodable\n", ++cas);
}
}
不能输入数据
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 20
struct Trie{
Trie *next[MAX];
int v;
};
Trie *root;
void CreatTrie(char * str){
int len=strlen(str),i,j,id;
Trie *p=root,*q;
for(i=0;i<len;i++){
id=str[i]-‘0‘;
if(p->next[id]==NULL){
q=(Trie*)malloc(sizeof(Trie));
q->v=1;
for(j=0;j<len;j++){
q->next[j]=NULL;
}
p->next[id]=q;
p=p->next[id];
}
else{
p->next[id]->v++;
p=p->next[id];
}
}
p->v=-1;
}
int FindTrie(char *str){
int len=strlen(str),i;
Trie *p=root;
for(i=0;i<len;i++){
int id=str[i]-‘0‘;
p=p->next[id];
if(p==NULL)
return 0;
if(p->v==-1)
return 1;
}
return 1;
}
int main()
{
char a[20];
int flag,k,i;
for(i=0;i<MAX;i++)
root->next[i]=NULL;
while(gets(a)&&a[0]!=‘9‘){
CreatTrie(a);
// k++;
}
gets(a);
if(FindTrie(a)) printf("YES\n");
else printf("NO\n");
return 0;
}