题意:一个码如果是另一个码的前缀,则 is not immediately decodable,不可直接解码,也就是给一串二进制数字给你,你不能对其解码,因解码出来可能有多种情况。
思路:将每个码按长度从短到长排序,逐个与其后面的码比较,若前面相同位数完全一样了,那就可以输出了。
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
#include <cstring>
#include <algorithm>
using namespace std;
vector< vector<int> > a;
bool cmp(vector<int> a, vector<int> b){return a.size()<b.size()? true: false;}
bool isid()
{
bool issub=false;
int t, j, k;
sort(a.begin(), a.end(), cmp); //按照元素的多少从少到多排序
/*test
for(t=0; t<a.size(); t++)
{
for(j=0; j<a[t].size(); j++)
{
cout<<a[t][j];
}
cout<<endl;
}*/
for( t=; t<a.size(); t++ ) //从小到大,一个个跟后面的比较前a[t].size()个是不是重叠,
{
for(j=t+; j<a.size(); j++)
{
issub=true;
for(k=; k<a[t].size(); k++)
{
if( a[t][k]!=a[j][k] )
{
issub = false; //只要有一个不同,就不是真子串
break;
}
}
if( issub==true ) //有一个串是另一个串的前缀
return false;
}
}
return true;
} int main()
{
//freopen("e:input.txt","r",stdin);
vector<int> tmp;
char c;
int i=, t, j, k, cnt=;
while( (c=getchar())!=EOF )
{
if( c=='' ) //一个例子结束
{ if( isid()==true ) //处理 a
cout<<"Set "<< ++cnt<<" is immediately decodable"<<endl;
else
cout<<"Set "<< ++cnt<<" is not immediately decodable"<<endl;
a.clear(); //例子结束,清理工作
}
else if( c=='\n' ) //只是换行
{
if(tmp.empty()==) //提交并清空
{
a.push_back(tmp);
tmp.clear();
}
}
else //c是0和1的
tmp.push_back(c-'') ;
}
return ;
}
Immediate Decodability