BZOJ 2217: [Poi2011]Lollipop 构造 + 思维

Code: 

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std; 
void setIO(string s) {
    string in=s+".in"; 
    freopen(in.c_str(),"r",stdin); 
}
const int maxn=1000005; 
char str[maxn]; 
int a[maxn],L[maxn<<1],R[maxn<<1],len[maxn]; 
int main() {
    // setIO("input");
    int n,m; 
    scanf("%d%d",&n,&m); 
    scanf("%s",str+1); 
    for(int i=1;i<=n;++i) {
        if(str[i]=='T') a[i]=2; 
        else a[i]=1; 
    } 
    for(int i=n;i>=1;--i) len[i]=a[i]==2?(len[i+1]+1):0; 
    int Sum=0;   
    for(int i=1;i<=n;++i) {
        Sum+=a[i]; 
        L[Sum]=1,R[Sum]=i;     
        if(a[i]==2) {
            if(len[i]>len[1]) L[Sum-1]=len[1]+2,R[Sum-1]=i+len[1];
            else if(len[i]!=n-i+1) R[Sum-1]=i+len[i],L[Sum-1]=len[i]+1; 
        }
    } 
    while(m--){
        int k; 
        scanf("%d",&k);  
        if(L[k]) printf("%d %d\n",L[k],R[k]); 
        else printf("NIE\n"); 
    }
    return 0; 
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值