码迷,mamicode.com
首页 > 其他好文 > 详细

hdu4346 枚举思维

时间:2015-02-07 13:14:04      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

http://acm.hdu.edu.cn/showproblem.php?pid=4346

Problem Description
There is a road from city A to city B.On the road,there are N positions(indexed from 0 to N-1).In order to celebrate the Multi-University training,the mayor of city A commands a worker to insert N flags on the N positions.The color of a flag is either red or green.We call the road is beautiful if and only if there exists at least one pair of non-negative integers (a,b) (0<=a<b<N and (a+b) is an even number) such that both a-th flag and b-th flag are red and (a+b)/2-th flag is green.Otherwise we call the road is ugly.Now,some positions have already been inserted flags.In order to make the road beautiful,the worker must carefully insert the flags on the positions which haven‘t been inserted.He wants to know how many different types of beautiful road he can make.The type of the road only depends on the flags‘ color.
 

Input
The first line of the input is the number of cases. On each case there is a line consists of a string.The length of the string is N.(0<=N<=800).The i-th character of the string is ‘R‘ or ‘G‘ or ‘?‘.‘R‘ means the flag on the i-th position which has been inserted is red.‘G‘ means the flag on the i-th position which has been inserted is green.‘?‘ means the i-th position hasn‘t been inserted a flag.
 

Output
A single line with the number of different types of road the worker can make,modulo 1,000,000,007.
 

Sample Input
4 ?G RG? ??? ????
 

Sample Output
0 1 1 4
/**
http://blog.csdn.net/julyana_lin/article/details/7849006
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
const int mod=1000000007;

LL mod_pow(int a,int n,int p)
{
    LL ret=1;
    LL A=a;
    while(n)
    {
        if(n&1)
        {
            ret=(ret*A)%p;
        }
        A=(A*A)%p;
        n>>=1;
    }
    return ret;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char a[1005];
        scanf("%s",a);
        int n=strlen(a);
        int unknown=0,r_num=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]=='?')
                unknown++;
            else if(a[i]=='R')
                r_num++;
        }
        LL unbea=(r_num==0);
        for(int i=0;i<n;i++)
        {
            if(a[i]=='R'||a[i]=='?')
            {
                int x=(a[i]=='R');
                unbea=(unbea+(x==r_num))%mod;
                for(int len=1;len+i<n;len+=2)
                {
                    int y=x;
                    for(int j=i+len;j<n;j+=len)
                    {
                        y+=(a[j]=='R');
                        if(a[j]=='G')break;
                        unbea=(unbea+(y==r_num))%mod;
                    }
                }
            }
        }
        printf("%I64d\n",mod_pow(2,unknown,mod)-unbea);
    }
    return 0;
}


hdu4346 枚举思维

标签:

原文地址:http://blog.csdn.net/lvshubao1314/article/details/43602271

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!