本題可以使用暴力法直接求解,思路也挺簡單的,不過實現起來也挺麻煩的。
本題最暴力直接使用strstr過。 這裡使用hash表的方法過,這種方法好像有個學名的,主要思路就是把乙個需要查詢的字串賦予乙個數值,那麼就可以把一串字串的比較轉換為乙個值的比較了,那麼就可以加速字串的查詢了。
#include #include #include const long long mod = (int)(1e9+7);//如果增加mod的話,會有很大機率出錯的,本題就不能增加mod,否則一直wa,不使用mod就馬上ac了
const int max_n = 61;
const int max_m = 11;
const int alp_len = 4;
const int significant = 3;
const char *inttochar = "atgc";
short chartoint[256];
char dict[max_m][max_n];
char substr[max_n];
long long finger;
bool searchfinger(char *txt, int l, int len)
if (f == finger) return true;
for (int j = 0; i < len; j++, i++)
return false;
}int main()
int len = max_n - 1;
int maxlen = 0;
char res[max_n] = ;
for (int i = 0; i < len; i++)//search every start position
if (j != n) break;//break to the next start position
if (l > maxlen || (l==maxlen && strcmp(res, substr)>0))
}} if (maxlen < significant)
else
}return 0;
}
使用strstr也可以,時間效率是一樣的:
#include #include #include const int max_n = 61;
const int max_m = 11;
const int alp_len = 4;
const int significant = 3;
char dict[max_m][max_n];
char substr[max_n];
int main()
int len = max_n - 1;
int maxlen = 0;
char res[max_n] = ;
for (int i = 0; i < len; i++)//search every start position
if (j != n) break;//break to the next start position
if (l > maxlen || (l==maxlen && strcmp(res, substr)>0))
}} if (maxlen < significant)
else
}return 0;
}
使用strstr的第二種方法:
const int max_n = 61;
const int max_m = 11;
const int alp_len = 4;
const int significant = 3;
char dict[max_m][max_n];
char substr[max_n];
int main()
int len = max_n - 1;
int maxlen = 0;
char res[max_n];
for (int i = 0; i < len; i++)//search every start position
if (j == n)
break; //break to the next start position}}
} if (maxlen < significant)
else
}return 0;
}
poj解題報告 3080
題意 求n個字串的公共最長串。思路很簡單 我們先按字串的長度由短到長進行快排。列舉第乙個字串的不同長度子串,判斷她是否為下面多有的公共子串?如果是的話,那麼我們就表明找到,則比較其長度,如果比已經找到的串長,那麼就替換結果串 否則按字典序比較。取字典序考前的,就可以。如下 include inclu...
POJ 3080 字尾陣列 KMP
題意 給定n個dna串,求最長公共子串。如果最長公共子串的長度小於3時輸出no significant commonalities,否則輸出該子串,如有多解請輸出字典序最小的解 思路 是poj 3405的弱化版。思路請參考 define crt secure no deprecate include...
POJ 3080 字串匹配
題意 給出n個字串,找出其最長公共子串,若子串長度 3,則輸出最長公共子串,否則輸出.本來以為要用到kmp或者字尾陣列什麼的,思考了很久沒有思路,看了一下discuss,發現可以暴力過,而且0ms,也是醉了.include include include include include includ...