hdu 5651

来源:互联网 发布:淘宝手机端详情页gif 编辑:程序博客网 时间:2024/06/08 08:22

xiaoxin juju needs help

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1376    Accepted Submission(s): 392


Problem Description
As we all known, xiaoxin is a brilliant coder. He knew **palindromic** strings when he was only a six grade student at elementry school.

This summer he was working at Tencent as an intern. One day his leader came to ask xiaoxin for help. His leader gave him a string and he wanted xiaoxin to generate palindromic strings for him. Once xiaoxin generates a different palindromic string, his leader will give him a watermelon candy. The problem is how many candies xiaoxin's leader needs to buy?
 

Input
This problem has multi test cases. First line contains a single integer T(T20) which represents the number of test cases.
For each test case, there is a single line containing a string S(1length(S)1,000).
 

Output
For each test case, print an integer which is the number of watermelon candies xiaoxin's leader needs to buy after mod 1,000,000,007.
 

Sample Input
3aaaabba
 

Sample Output
121
 

Source
BestCoder Round #77 (div.2)
 

Recommend
wange2014


有点类似于组合,用杨辉三角与二项式系数的关系打出一个表。


#include<iostream>#include<cstdio>#include<cstring>using namespace std;int c[1005][1005];int main(){    int cnt[1005],ch[1005],T;    char S[1005];    c[0][0]=1;    c[1][0]=c[1][1]=1;    for(int i=2;i<1005;i++) {        c[i][0]=c[i][i]=1;        for(int j=1;j<i;j++) {            c[i][j]=c[i-1][j-1]+c[i-1][j];            if(c[i][j]>=1000000007) {                c[i][j]%=1000000007;            }        }    }    scanf("%d",&T);    while(T--) {        scanf("%s",S);        memset(cnt,0,sizeof(cnt));        int k=0,flag=0,sum=0;        long long ans=1;        for(int i=0;i<strlen(S);i++) {            if(!cnt[S[i]]) {                ch[k++]=S[i];            }            cnt[S[i]]++;        }        for(int i=0;i<k;i++) {            if(cnt[ch[i]]%2==1) {                sum+=cnt[ch[i]]/2;                flag++;            }            else {                sum+=cnt[ch[i]]/2;            }            cnt[ch[i]]/=2;        }        if(flag>1) {            printf("0\n");            continue;        }        for(int i=0;i<k;i++) {            if(cnt[ch[i]]==0) {                continue;            }            else {                ans*=c[sum][cnt[ch[i]]];                sum-=cnt[ch[i]];                if(ans>1000000007) {                    ans%=1000000007;                }            }        }        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击