描述單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」**現兩次),在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關係,例如at和atide間不能相連。
輸入每個測試檔案只包含一組測試資料,每組輸入的第一行為乙個單獨的整數n(n<=20)表示單詞數,以下n行每行有乙個單詞,輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在。
輸出對於每組輸入資料,輸出以此字母開頭的最長的「龍」的長度。
下面的測試樣例最後連成的「龍」為atoucheatactactouchoose。
輸入樣例 15attouch
cheat
choose
tact
a
輸出樣例 1這道題昨天寫到了凌晨1點,哎,開始考慮要不要幾點之後禁止寫**了,對睡眠傷害太大了,得不償失啊。23
注意,要求的是最長的龍的長度,所以重合部分盡量最小。
例子:bbaa 和 aacc 這兩個單詞的重合部分應該是a,而不是aa。
下面這句話我一直沒看懂,一開始以為是兩個單詞不能呈現包含關係
但是結合上一點看,aa和aabc這兩個單詞是可以接龍的,重合部分為a。
所以這句話的意思應該是,重合部分不能覆蓋前後某個單詞。
相鄰的兩部分不能存在包含關係,例如at和atide間不能相連乙個單詞可以出現兩次,這就意味著如aba這樣的單詞可以自己接自己,重合部分為a。所以單詞找接龍的時候沒必要避開自己。
被上面這三點坑的死去活來。
不過是乙個深度優先搜尋罷了,不斷尋找子串,記錄每個單詞的使用次數,注意狀態的恢復。
關鍵部分是尋找子串,注意上面三個坑點。
一開始還打算把每個單詞能接龍的單詞都找出來,後來看看網上的**,發現沒這個必要。但還是把自己的**擺出來吧。我的**複雜了,關鍵還是看看我的**上面的思想吧。
int len;
#include #include #include int ans;
char* tmp;
struct wordword[22];
int strstr(char* a,char b,int t)
void dfs(struct word* w,int len)
dfs(w->n[i],len);
w->n[i]->accurnum--;
len -= w->childlen[i];
}if(len > ans)ans = len;
}void judge(struct word* a,struct word* b)
}if(flag && j != strlen(a->s))
s = strstr(b->s, (a->s)[0],s-1);
}}int main()
scanf("%c",&l);
scanf("%c",&l);
for(int i = 0;i < n;i++)
}
ans = 0;
for(int i = 0;i < n;i++)
}printf("%d\n",ans);
}
1018 單詞接龍
題目描述 description 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beast...
1220 單詞接龍
題目 單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分...
zufeoj 單詞接龍
單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的 龍 每個單詞都最多在 龍 中出現兩次 在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存...