题目链接:http://poj.org/problem?id=1580
题意:给出两个串a,b,求它们的最大匹配度。最大匹配度=最大匹配个数*2/(len_a+len_b)
因为a和b的最开始匹配的部位都是任意的,所以枚举它们最开始匹配的部位即可。复杂度O(len_a*len_b*(k))k<=min(len_a,len_b);
其实这个穿应该都不是很长(不然这么挫的办法不可能0MS过。。)
#include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <string> #include <cctype> #include <vector> #include <cstdio> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #define ll long long #define maxn 360 #define pp pair<int,int> #define INF 0x3f3f3f3f #define max(x,y) ( ((x) > (y)) ? (x) : (y) ) #define min(x,y) ( ((x) > (y)) ? (y) : (x) ) using namespace std; char s[100001],t[100001]; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } void solve() { int lens=strlen(s),lent=strlen(t),ans=-INF; for(int i=0;i<lens;i++) { for(int j=0;j<lent;j++) { int cnt=0; for(int k=i,m=j;k<lens&&m<lent;k++,m++) if(s[k]==t[m]) cnt++; ans=max(ans,cnt); } } ans*=2;int tem=gcd(ans,lens+lent); if(ans%(lens+lent)==0) printf("appx(%s,%s) = %d\n",s,t,ans/(lens+lent)); else printf("appx(%s,%s) = %d/%d\n",s,t,(ans/tem),(lens+lent)/tem); } int main() { while(~scanf("%s",s)&&s[0]!='-') { scanf("%s",t); solve(); } return 0; }
时间: 2024-10-12 18:38:35