zoukankan      html  css  js  c++  java
  • 洛谷 P3732 [HAOI2017]供给侧改革【trie树】

    参考:http://blog.csdn.net/di4covery/article/details/73065684
    我以为是后缀数组+某某数据结构,结果居然是01trie!!题解说“因为是随机的所以大概不会超过40个所以40是咋算的啊我一介非酋真的不能估计……~
    好了正解是这样的,先把询问离线按r排序,然后按照每个r的位置把这个后缀的前40个(我比较非就写了50个)放进trie树里,每扫到trie深度为dep的一个节点时,对这个dep记录一个tg代表最后一次更新到这个点的后缀的开始位置,于是把这个后缀塞进去就能得到一个tg数组,tg[i]记录了最晚的后缀开始位置与当前后缀的LCP是i这个深度,于是就可以更新了。
    注意这里的LCP并不是最长,所以要贪心的更新,即i*(tg[i]-max(q[ti].l-1,tg[i+1])),如果i不是最长后缀就留到i+1更新

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    const int N=5000005;
    int n,m,tg[N],c[N][2],f[N],tot;
    long long ans[N];
    char s[N];
    struct qwe
    {
    	int l,r,id;
    }q[N];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.r<b.r;
    }
    void add(int x)
    {
    	int now=0;
    	for(int i=0;i+x<=n&&i+1<=50;i++)
    	{
    		int a=s[i+x]-'0';
    		if(!c[now][a])
    			c[now][a]=++tot;
    		tg[i+1]=max(f[c[now][a]],tg[i+1]);
    		f[c[now][a]]=x;
    		now=c[now][a];
    	}
    }
    int main()
    {
    	n=read(),m=read();
    	scanf("%s",s+1);
    	for(int i=1;i<=m;i++)
    		q[i].l=read(),q[i].r=read(),q[i].id=i;
    	sort(q+1,q+1+m,cmp);
    	int ti=1;
    	for(int i=1;i<=n;i++)
    	{
    		add(i);
    		while(ti<=m&&q[ti].r==i)
    		{
    			for(int i=1;i<=50;i++)
    			{
    				if(tg[i]>=q[ti].l)
    					ans[q[ti].id]+=1ll*i*(tg[i]-max(q[ti].l-1,tg[i+1]));
    				else
    					break;
    			}
    			ti++;
    		}
    	}
    	for(int i=1;i<=m;i++)
    		printf("%lld
    ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    Android xml text 预览属性
    GridView、ListView默认的点击背景修改
    java.util.ConcurrentModificationException
    Android 菜单定制使用小结
    Panel 中加载窗体
    git代理配置
    TableLayoutPanel 动态添加 行 列
    C# 左右补零
    Dart Map<> 添加 元素
    Mac 永久添加 环境变量方法
  • 原文地址:https://www.cnblogs.com/lokiii/p/8522707.html
Copyright © 2011-2022 走看看