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; } }
浙公网安备 33010602011771号