#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;i
if(s[i]=='w'){
ans+=(bt[i+1]*pre[i+1])%mod;
ans%=mod;
}
}
cout<
}
}
我的想法就是做O的前後綴 然後對每個w相乘該位置的前後綴
這題記憶體很小,無法用這種方式(我是用fseek才AC的)