标签:
3 AC CG GT CGAT 1 AA AAA 0
Case 1: 3 Case 2: 2
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 510; 4 struct Trie { 5 int ch[maxn][4],fail[maxn],cnt[maxn],tot; 6 int id[256]; 7 void init() { 8 tot = 0; 9 newnode(); 10 for(int i = 0; i < 4; ++i) id["ACGT"[i]] = i; 11 } 12 int newnode() { 13 memset(ch[tot],0,sizeof ch[tot]); 14 fail[tot] = cnt[tot] = 0; 15 return tot++; 16 } 17 void insert(char *str,int rt = 0) { 18 for(int i = 0; str[i]; ++i) { 19 int &x = ch[rt][id[str[i]]]; 20 if(!x) x = newnode(); 21 rt = x; 22 } 23 cnt[rt]++; 24 } 25 void build(int rt = 0) { 26 queue<int>q; 27 for(int i = 0; i < 4; ++i) 28 if(ch[rt][i]) q.push(ch[rt][i]); 29 while(!q.empty()) { 30 rt = q.front(); 31 q.pop(); 32 cnt[rt] += cnt[fail[rt]]; 33 for(int i = 0; i < 4; ++i) { 34 int &x = ch[rt][i],y = ch[fail[rt]][i]; 35 if(x) { 36 fail[x] = y; 37 q.push(x); 38 } else x = y; 39 } 40 } 41 } 42 int dp[maxn][11*11*11*11 + 5]; 43 int solve(char *str) { 44 int bt[4] = {0,0,0,1},num[4] = {}; 45 for(int i = 0; str[i]; ++i) ++num[id[str[i]]]; 46 for(int i = 2; i >= 0; --i) 47 bt[i] = bt[i + 1]*(num[i] + 1); 48 memset(dp,-1,sizeof dp); 49 int ans = dp[0][0] = 0; 50 for(int a = 0; a <= num[0]; ++a) 51 for(int b = 0; b <= num[1]; ++b) 52 for(int c = 0; c <= num[2]; ++c) 53 for(int d = 0; d <= num[3]; ++d) { 54 int hs = a*bt[0] + b*bt[1] + c*bt[2] + d; 55 for(int i = 0; i < tot; ++i) { 56 if(dp[i][hs] == -1) continue; 57 for(int k = 0; k < 4; ++k) { 58 if(a == num[0] && k == 0) continue; 59 if(b == num[1] && k == 1) continue; 60 if(c == num[2] && k == 2) continue; 61 if(d == num[3] && k == 3) continue; 62 int x = dp[ch[i][k]][hs + bt[k]]; 63 int y = dp[i][hs] + cnt[ch[i][k]]; 64 dp[ch[i][k]][hs + bt[k]] = max(x,y); 65 } 66 } 67 } 68 int st = num[0]*bt[0] + num[1]*bt[1] + num[2]*bt[2] + num[3]*bt[3]; 69 for(int i = 0; i < tot; ++i) 70 ans = max(ans,dp[i][st]); 71 return ans; 72 } 73 } ac; 74 char str[maxn]; 75 int main() { 76 int n,cs = 1; 77 while(scanf("%d",&n),n){ 78 ac.init(); 79 while(n--){ 80 scanf("%s",str); 81 ac.insert(str); 82 } 83 scanf("%s",str); 84 ac.build(); 85 printf("Case %d: %d\n",cs++,ac.solve(str)); 86 } 87 return 0; 88 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4943336.html