codeforces 138E. Hellish Constraints

来源:互联网 发布:简单软件 编辑:程序博客网 时间:2024/06/05 03:30

先考虑只有一个限制时,右端点扫过去,维护每个左端点是否满足限制,
A[i]=0表示i开头的后缀不满足,A[i]=1表示i开头的后缀满足
那么当新加入一个字母到后缀时,若他不是当前限制的字母,则对所有左端点的答案都无影响,若他是,它会使那些之前含L-1个限制字母的后缀变得合法,含R个的变得不合法,
记录一下这个字母w第i次出现的位置las[w][i],
将这个字母加入,就是对las[now-L]+1~las[now-L]赋为合法,las[now-R-1]+1~las[now-R-1]赋为不合法,
注意到每个位置至多被赋值合法1次,不合法一次,对于一个限制,扫过去是O(n)的
再把k个限制一起考虑就行了,总复杂度O(nk)

code:

#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<climits>#include<complex>#include<iostream>#include<algorithm>#define ll long long#define inf 1e9using namespace std;const int maxn = 110000;const int maxk = 1100;const int maxv = 26;char str[maxn],s[110];int n,m,L,R;int las[maxv][maxn],col[maxv];int f[maxn];struct node{    int l,r;    node(){}    node(const int _l,const int _r){l=_l;r=_r;}}a[maxv][maxk]; int cnt[maxv];ll ans;int main(){    scanf("%s",str); n=strlen(str);    scanf("%d%d%d",&m,&L,&R);    int ev=0;    for(int i=1;i<=m;i++)    {        int l,r; scanf("%s%d%d",s,&l,&r);        const int w=s[0]-'a';        a[w][++cnt[w]]=node(l,r);        if(l==0) ev++;    }    for(int i=0;i<26;i++) las[i][col[i]=0]=-1;    int now=0;    for(int i=0;i<n;i++)    {        f[i]=ev; if(f[i]>=L&&f[i]<=R) now++;        const int w=str[i]-'a';        las[w][++col[w]]=i;        for(int j=1;j<=cnt[w];j++)        {            if(col[w]>=a[w][j].l)            {                for(int k=las[w][max(0,col[w]-a[w][j].l)]+1;k<=las[w][col[w]-a[w][j].l+1];k++)                {                    f[k]++;                    if(f[k]==L) now++;                    if(f[k]==R+1) now--;                }            }            if(col[w]>a[w][j].r)            {                for(int k=las[w][col[w]-a[w][j].r-1]+1;k<=las[w][col[w]-a[w][j].r];k++)                {                    f[k]--;                    if(f[k]==R) now++;                    if(f[k]==L-1) now--;                }            }        }        ans+=(ll)now;    }    printf("%I64d\n",ans);    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学校交学费的卡丢了怎么办 采购零星材料无发票怎么办 租房合同弄丢了怎么办 买房的合同丢了怎么办 押金的收据丢了怎么办 房东的合同掉了怎么办 个人档案里单位没有放合同怎么办 签的合同掉了怎么办 一方合同弄丢了怎么办 合同丢了怎么办如何补 签了定金合同对方违约怎么办 医学出生证明丢了怎么办 易通行出站未刷怎么办 炭烧酸奶过期了怎么办 西安建行etc坏了怎么办 电机在设备壳体中拔不出来怎么办 公司变更股东不能亲临现场怎么办? 公司股东变更老股东不签字怎么办 公司变更地址股东不签字怎么办 公司变更股份股东不签字怎么办 公司股东离职股东没变更过来怎么办 河南省宋基投资公司欠钱怎么办 曲江楼观2O18怎么办 华旭金卡身份证扫描不了怎么办 水表里有钱没水怎么办? ff14过图速度慢怎么办 想让电表跑的慢怎么办 家里电表突然没有电了怎么办 电表不识别电卡怎么办 家里水表不转了怎么办 车管所体检色弱怎么办 煤气押金单没了怎么办 中国建设银行登录密码忘了怎么办 中国建设银行登录密码忘记了怎么办 公司车辆怎么办换新能源牌 杭州新能源汽车牌照外地人怎么办 建行登录密码忘了怎么办 新捷达epc灯亮怎么办 捷达车玻璃升降偏离怎么办 交金中断一个月怎么办 博士拟录取没导师怎么办