题目链接: http://poj.org/problem?id=1056
题意: 给定编码集, 判断它是否为可解码(没有任何一个编码是其他编码的前缀).
分析: 简单题目, 遍历一遍即可, 只需判断两个编码是否互为前缀或相等即可.
代码:
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 using namespace std; 5 string line; 6 vector<string> vs; 7 8 bool isPrefix(string s1,string s2){ 9 int len1 = s1.length(); 10 int len2 = s2.length(); 11 int i; 12 if(len1<len2){ //判断s1 是否为s2前缀 13 for(i=0;i<len1;++i){ 14 if(s1.at(i) != s2.at(i)) 15 break; 16 } 17 if(i == len1) 18 return true; 19 else 20 return false; 21 } 22 if(len1 > len2) 23 return isPrefix(s2,s1); 24 if(len1 == len2){ 25 return s1 == s2; 26 } 27 } 28 29 int main(){ 30 int sets = 0; 31 while(cin>>line){ 32 sets++; 33 vs.clear(); 34 // enter a set 35 while(line.at(0)!=‘9‘){ 36 vs.push_back(line); 37 cin>>line; 38 } 39 int len = vs.size(); 40 int i,j; 41 for(i=0;i<len;++i){ 42 for(j=0;j<len;++j){ 43 if(i!=j && isPrefix(vs[i],vs[j])){ 44 break; 45 } 46 } 47 if(j!=len) 48 break; 49 } 50 if(i!=len) 51 cout<<"Set "<<sets<<" is not immediately decodable"<<endl; 52 else 53 cout<<"Set "<<sets<<" is immediately decodable"<<endl; 54 //clear to accpet the new set. 55 vs.clear(); 56 } 57 return 0; 58 }
原文:http://www.cnblogs.com/roger9567/p/4887158.html