#32355: __求救


dfd8282@gmail.com (fishhh)


#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相乘該位置的前後綴

 

#32416: Re: 求救


cges30901 (cges30901)


#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的)