5306: 小伍的字符串难题

描述

有一天,小伍拿到了一些字母'X'和'Y'。但是她不是很开心,为什么呢?

因为字符串中似乎有“XY”的连续子串。她想对它做一些操作,规则是一次操作可以用“YYX”取代掉连续子串“XY”。
如果最后的字符串没有了“XY”,(其实就是最后的字符串字符'X'后面的所有位置是没有'Y'),她就会很开心。
那么小伍想知道她最少要经过几次操作才能让她开心。如果次数太大,对1000000007取余。

输入

输入有多组字符串,输入到文件结束。字符串由字符“X”和“Y”组成,长度length的范围(1<=length<=10^6)

输出

最少的步数,对10^7取余。

样例输入

 XY

XXY

样例输出

1

3

提示

 对于样例2: "XXY"->"XYYX" ->"YYXYX"->"YYYYXX"

另:可能要用到__int64,尝试下吧

思路:  对于字符串为n个X和1个Y的组合步数为2^n-1,向右遍历字符串记录x的的个数,每遇到一次Y,步数+2^n-1.

如XXYXXY,第一次遇到Y,字符串为YYYYXXXXY,前缀Y可忽略,即XXXXY,步数+2^4-1;

对1e7+7取余,不是1e7取余.

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1000000007;
string s;
__int64 poww(__int64 a,__int64 b)
{  __int64 c=N;
    __int64  ans=1;
    a=a%c;
    while(b>0) {
        if(b%2==1)
            ans=(ans*a)%c;
        b=b/2;
        a=(a*a)%c;
    }
    return ans-1;
}
int main()
{   while(cin>>s)
    {__int64 len=s.size(),i;
    __int64 sum=0;
    __int64 x=0,y=0;
    for(i=0;i<len;i++)
    {  if(s[i]=='X')
        x++;
        else
        { sum+=poww(2,x);
          sum=sum%N;
        }
    }
    cout<<sum<<endl;
    }
}
View Code

 

posted on 2019-08-05 10:47  还是力量不够  阅读(200)  评论(0)    收藏  举报

导航