BestCoder Round #77 (div.2)xiaoxin juju needs help

7694 단어 ACMHDU항주 전기
xiaoxin juju needs help
 
 Accepts: 150
 
 Submissions: 966
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
문제 설명
xiaoxin         ,                 。  ,xiaoxin   :        SS     ,                       。

      ,xiaoxin          ,           。  ,leader  xiaoxin     , xiaoxin                  ,                       。  leader  xiaoxin,                      。

      xiaoxin leader            ?

입력 설명
T(T\leq 20)T(T20)S(1\leq length(S)\leq 1,000)S(1length(S)1,000)

출력 설명
        ,     ,   leader          ,    1,000,000,0071,000,000,007

입력 샘플
3
aa
aabb
a

출력 샘플
1
2
1

% 1000000007 을 보니까 낯 이 익 네요.
분석:
문자열 의 모든 자모 총수 가 홀수 인 개수 가 1 보다 많 지 않 을 때 만 회 문 수 를 구성 할 수 있 습 니 다.
회 문 수 를 구성 할 수 있다 면 알파벳 의 절반 으로 구 성 될 수 있 는 문자열 의 개 수 를 요구 하면 회 문 수 입 니 다.
문자열 aaabbccccdddddddd
총수 가 홀수 인 자 모 는 a 만 있 고, 회 문 열 을 구성 할 수 있다.
이 를 (abccd) a (abccd) 로 분해 합 니 다.
대칭 성 을 통 해 알 수 있 듯 이 문자열 abccd 의 조합 수 만 요구 하면 됩 니 다.
즉 결과 = C (7, 1) * C (6, 1) * C (5, 2) * C (3, 3)% 1000000007
문 제 는 조합 수 를 구 하 는 문제 로 바 뀌 었 다.
조합 수 는 모델 링 시 계 를 작성 하면 됩 니 다. 상세 한 것 은 코드 를 보십시오.
#include<iostream>
#include<cstdio>
#include <cstring>
using namespace std;
int cmob[1005][1005];//        cmob[m][n]   C(M,N)
int ccmob(){//      
    int i,j;
    cmob[0][0] = 1;
    for(int i = 0;i < 1005;i++) {
        cmob[i][1] = i;
        cmob[i][0] = 1;
    }
    for(int i = 2;i < 1001;i++) {
        for(int j = 1;j <= i;j++) {
            cmob[i][j] = (cmob[i-1][j-1] + cmob[i-1][j]) % 1000000007;//                
        }
    }
}
int main()
{
    ccmob();
    int t,n,temp,flag,sum,k,ans;
    string st;
    int num[30],tp[30];//num             ,tp                ,            (          )
    cin >> t;
    while(t--) {
        k = sum = flag = 0;
        ans =  1;
        for(int j = 0;j < 30;j++) {
            num[j] = 0;
            tp[j] = 0;
        }   //        

        cin >> st;
        for(int i = 0;i < st.length();i++) {//           
            num[st.at(i) - 97]++;
        }
        for(int j = 0;j < 26;j++) {
                if(num[j] != 0) {
                    sum += num[j] / 2;//sum       
                    if(num[j] % 2 == 1) flag ++;//flag                1    
                    if (flag > 1) {
                    cout << "0" << endl;
                    break;
                    }
                    tp[k++] = num[j] / 2;//                
                }
        }
        if(flag < 2){//      
            for(int j = 0;j < k - 1;j++) {// C(SUM,TP[J])      ,  sum         
            ans *= cmob[sum][tp[j]];
            sum-=tp[j];
            }
            cout << ans << endl;
        }

    }
    return 0;
}

좋은 웹페이지 즐겨찾기