字符串应用加集合应用,每一次比较的时候只需要判断一个字符串的字典序前面的所有的字符串是不是他的前缀就行了,判前缀的时候使用string类的s1.compare(0, s2.length(), s2)这样的函数就行了。
#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
set<string> s;
int case_count;
void func()
{
set<string>::iterator it_i, it_j;
bool f = true;
for(it_i=s.begin(); it_i!=s.end(); it_i++)
{
for(it_j=s.begin(); it_j!=it_i; it_j++)
{
if(it_i->length()>it_j->length() && 0==it_i->compare(0,it_j->length(),*it_j))
{
f = false;
goto end;
}
}
}
end:
if(f)
printf("Set %d is immediately decodable\n", case_count);
else
printf("Set %d is not immediately decodable\n", case_count);
}
int main(void)
{
char buffer[20];
string str;
s.clear();
case_count = 0;
while(gets(buffer) != NULL)
{
if(!strcmp(buffer,"9"))
{
case_count ++;
func();
s.clear();
}
else
{
str.assign(buffer);
s.insert(str);
}
}
return 0;
}