POJ 2797编程为什么出错啊

来源:百度知道 编辑:UC知道 时间:2024/06/07 16:46:40
题目具体如下

一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon"。注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在希望能用前缀来缩略的表示单词。例如, "carbohydrate" 通常用"carb"来缩略表示. 现在给你一组单词, 要求你找到唯一标识每个单词的最短前缀
在下面的例子中,"carbohydrate" 能被缩略成"carboh", 但是不能被缩略成"carbo" (或其余更短的前缀) 因为已经有一个单词用"carbo"开始
一个精确匹配会覆盖一个前缀匹配,例如,前缀"car"精确匹配单词"car". 因此 "car" 是 "car"的缩略语是没有二义性的 , “car”不会被当成"carriage"或者任何在列表中以"car"开始的单词.

Input
输入包括至少2行,至多1000行. 每行包括一个以小写字母组成的单词,单词长度至少是1,至多是20.

Output
输出的行数与输入的行数相同。每行输出由相应行输入的单词开始,后面跟着一个空格接下来是相应单词的没有二义性的最短前缀标识符。

Sample Input

carbohydrate
cart
carburetor
caramel
caribou
carbonic
cartilage
carbon
carriage
carton
car
carbonate

Sample Output

没耐心看别人代码,所以把我写的粘在这,我的思路跟你一样,你就对照着看看,希望有帮助。我的用G++已AC。

#include<iostream>
using namespace std;
#include<cstring>
struct Ask{//使用结构存放单词和前缀
char word[21];
char pre[21];
};
int main(){
Ask str[1000];
int n=0,flag=0,judge=0;
for(int i=0;i<1000;i++)//初始化
for(int j=0;j<21;j++)
str[i].word[j]=str[i].pre[j]='\0';
while(gets(str[n].word)&&str[n].word[0])//读入单词,遇到空行就跳出
n++;
for(int i=0;i<n;i++)//双重循环,将每个单词的字母按顺序存入对应前缀数组中,每存一个就于所有数组进行比较
for(int j=0;j<strlen(str[i].word);j++){
str[i].pre[j]=str[i].word[j];
flag=0;
for(int k=0;k<n;k++){//进行比较,如果flag=1,说明只与自己重合,符合最短前缀的不二性
for(int h=0;h<strlen(str[i].pre);h++)//这三行是对前缀与每个单词比较
if(str[i].pre[h]==str[k].word[h]) judge++;
if(judge==strlen(str[i].pre)) flag++;
judge=0;
if(flag>1) break;
}
if(flag==1) break;
}