【GDKOI2003】最大公共子串
Description
從一個(gè)給定的串中刪去(不一定連續(xù)地刪去)0個(gè)或0個(gè)以上的字符,剩下的字符按原來的順序組成的串是該串的字串。例如:“”, “a”, “aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的字串。(例子中的串不包括引號(hào))
編程求N個(gè)非空串的最長公共子串的長度。
限制:2<=N<=100:N個(gè)串中的字符只會(huì)是數(shù)字0,1,…,9或小寫字母a,b,…,z;每個(gè)串非空且最多含100個(gè)字符;N個(gè)串的長度的乘積不會(huì)超過30000。
Input
文件第一行是一個(gè)整數(shù)T,表示測試數(shù)據(jù)的個(gè)數(shù)(1<=T<=10)。接下來T組測試數(shù)據(jù)。各族測試數(shù)據(jù)的第一行是一個(gè)整數(shù)Ni,表示第i數(shù)據(jù)中串的個(gè)數(shù)。各組測試數(shù)據(jù)的第2到N+1行中,每行一個(gè)串,串中不會(huì)有空格,但行首和行未可能有空格,這些空格當(dāng)然不算作串的一部分。
Output
輸出T行,每行一個(gè)數(shù),第I行的數(shù)表示第I組測試數(shù)據(jù)中Ni的非空串的最長公共子串的長度
Sample Input
1
3
ab
bc
cd
Sample Output
0
Data Constraint
.
.
.
.
.
分析
.
.
.
.
.
程序:
#include<iostream> #include<string.h> using namespace std; char s[105][105]; int len[105],dp[30005],n;int work(int *x) {int h,i,r,j;for (i=1;i<=n;i++)if (x[i]==0) return 0;for (h=x[n]-1,i=n-1;i>=1;i--)h=h*len[i]+x[i]-1;if (dp[h]>=0) return dp[h];for (i=2;i<=n;i++)if (s[1][x[1]-1]!=s[i][x[i]-1]) break;if (i>n){for (j=1;j<=n;j++)x[j]--;r=work(x)+1;for (j=1;j<=n;j++)x[j]++;} else{r=0;for (j=1;j<=n;j++){x[j]--;int p=work(x);r=max(p,r);x[j]++;}}dp[h]=r;return r; } int main() {int e,t[105];cin>>e;while (e--) {cin>>n;for (int i=1;i<=n;i++){cin>>s[i];len[i]=t[i]=strlen(s[i]);}memset(dp,-1,sizeof(dp));cout<<work(t)<<endl;}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499923.html
總結(jié)
以上是生活随笔為你收集整理的【GDKOI2003】最大公共子串的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【GDOI2016模拟3.11】历史
- 下一篇: 【GDKOI2003】分球