Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
递归+组合数就解决,大水题一个!0ms无压力#include <iostream> #include <stdio.h> #include <string.h> #include <vector> #include <string> using namespace std; long long int comb(int n, int m){ if(m == 0 || m == n) return 1; if(m > n/2) m = n-m; long long int ans = 1; for(int i = n; i >= n-m+1; i--) ans *= i; for(int i = 2; i <= m; i++) ans /= i; return ans; } struct node{ char bh;//a~z vector<node*> suc; } pool[26]; void init(){ for(int i = 0; i < 26; i++) { pool[i].bh = 'a'+i; pool[i].suc.clear(); } } string s1, s2; int M; long long int ANS; void buildTree(node *root, int start1, int end1, int start2, int end2){ if(start1 > end1) return; while(start1 <= end1){ char tar = s1[start1]; int pos; for(int i = start2; i <= end2; i++){ if(s2[i] == tar){ pos = i; break; } } root->suc.push_back(&pool[tar-'a']); buildTree(&pool[tar-'a'], start1+1, start1+pos-start2, start2, pos-1); start1 = start1+pos-start2+1; start2 = pos+1; } } void getAns(node *root){ int gs = root->suc.size(); for(int i = 0; i < gs; i++) getAns(root->suc[i]); ANS *= comb(M, gs); } int main() { while(cin >> M){ if(M == 0) break; init(); node *root; cin >> s1 >> s2; int len = s1.length(); root = &pool[s1[0]-'a']; buildTree(root, 1, len-1, 0, len-2); ANS = 1; getAns(root); cout << ANS << endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator