• 注册
当前位置:1313e > 默认分类 >正文

PAT B1040/A1093 有几个PAT

1040 有几个PAT (25 分)

字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

现给定字符串,问一共可以形成多少个 PAT

输入格式:

输入只有一行,包含一个字符串,长度不超过10​5​​,只包含 PAT 三种字母。

输出格式:

在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:

APPAPT

输出样例:

2

bug代码:

#include		 
#include
using namespace std;const int N=100010;
const int MOD=1000000007;int main(){string s;cin>>s;int leftPNum[N]={0};for(int i=0;i0){leftPNum[i]=leftPNum[i-1];}if(s[i]=='P'){leftPNum[i]++;}}int rigthTNum=0,ans=0;for(int i=s.length()-1;i>=0;i--){if(s[i]=='T'){rigthTNum++;}else if(s[i]=='A'){ans+=(leftPNum[i]*rigthTNum)%MOD;}}cout<

对于本人来说此错误隐藏得很深,

ans+=(leftPNum[i]*rigthTNum)%MOD;

和ans=(ans+leftPNum[i]*rigthTNum)%MOD;的区别

先加再取余和先取余再加结果是不一样的,ans=ans+局部取余得到的ans再去下次累加局部取余是错的,除非再ans%=MOD;才行,每次都规范化一次

eg:下面的非标准代码也是正确的

#include		 
#include
using namespace std;const int N=100010;
const int MOD=1000000007;int main(){string s;cin>>s;int leftPNum[N]={0};for(int i=0;i0){leftPNum[i]=leftPNum[i-1];}if(s[i]=='P'){leftPNum[i]++;}}int rigthTNum=0,ans=0;for(int i=s.length()-1;i>=0;i--){if(s[i]=='T'){rigthTNum++;}else if(s[i]=='A'){// ans=(ans+leftPNum[i]*rigthTNum)%MOD;ans+=(leftPNum[i]*rigthTNum)%MOD;ans%=MOD;}}cout<

 

正确代码

#include		 
#include
using namespace std;const int N=100010;
const int MOD=1000000007;int main(){string s;cin>>s;int leftPNum[N]={0};for(int i=0;i0){leftPNum[i]=leftPNum[i-1];}if(s[i]=='P'){leftPNum[i]++;}}int rigthTNum=0,ans=0;for(int i=s.length()-1;i>=0;i--){if(s[i]=='T'){rigthTNum++;}else if(s[i]=='A'){ans=(ans+leftPNum[i]*rigthTNum)%MOD;}}cout<

 

 

 

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录
相关推荐