#include "iostream"using namespace std;int mod=1e9+7;int pre[1000100],bt[1000100];int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); string s; int t; cin>>t; cin.ignore(); while(t--){ getline(cin,s); pre[0]=0; for(int i=1;i<=s.size();i++){ if(s[i-1]=='O')pre[i]=pre[i-1]+1; else pre[i]=pre[i-1]; } bt[s.size()+1]=0; for(int i=s.size();i>=1;i--){ if(s[i-1]=='O')bt[i]=bt[i+1]+1; else bt[i]=bt[i+1]; } int ans=0; for(int i=0;i<s.size();i++){ if(s[i]=='w'){ ans+=(bt[i+1]*pre[i+1])%mod; ans%=mod; } } cout<<ans<<"\n"; }}我的想法就是做O的前後綴 然後對每個w相乘該位置的前後綴
#include "iostream"using namespace std;int mod=1e9+7;int pre[1000100],bt[1000100];int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);string s;int t;cin>>t;cin.ignore();while(t--){getline(cin,s);pre[0]=0;for(int i=1;i<=s.size();i++){if(s[i-1]=='O')pre[i]=pre[i-1]+1;else pre[i]=pre[i-1];}bt[s.size()+1]=0;for(int i=s.size();i>=1;i--){if(s[i-1]=='O')bt[i]=bt[i+1]+1;else bt[i]=bt[i+1];}int ans=0;for(int i=0;iif(s[i]=='w'){ans+=(bt[i+1]*pre[i+1])%mod;ans%=mod;}}cout<}}我的想法就是做O的前後綴 然後對每個w相乘該位置的前後綴
這題記憶體很小,無法用這種方式(我是用fseek才AC的)