后缀数组模板

印象里青岛赛这个板子挂了,可能有bug,作者懒得找了,慎用。

class SF
{
    //N:数组大小
public:
    int x[N], y[N], c[N];
    int Height[N], str[N], SA[N], Rank[N];//Height数组从2开始,SA记录Rank=i的下标
    int slen;
    int m = 1050;//字符集处理大小(传入如果不是数字,需要做位移转换)
    bool cmp(int* r, int a, int b, int l) {
        return r[a] == r[b] && r[a + l] == r[b + l];
    }
    void Suffix(int n) {
        ++n;
        int i, j, p;
        for (i = 0; i < m; ++i) c[i] = 0;
        for (i = 0; i < n; ++i) c[x[i] = str[i]]++;
        for (i = 1; i < m; ++i) c[i] += c[i - 1];
        for (i = n - 1; i >= 0; --i) SA[--c[x[i]]] = i;
        for (j = 1; j <= n; j <<= 1) {
            p = 0;
            for (i = n - j; i < n; ++i) y[p++] = i;
            for (i = 0; i < n; ++i) if (SA[i] >= j) y[p++] = SA[i] - j;
            for (i = 0; i < m; ++i) c[i] = 0;
            for (i = 0; i < n; ++i) c[x[y[i]]]++;

            for (i = 1; i < m; ++i) c[i] += c[i - 1];
            for (i = n - 1; i >= 0; --i) SA[--c[x[y[i]]]] = y[i];

            swap(x, y);
            p = 1; x[SA[0]] = 0;
            for (i = 1; i < n; ++i) {
                x[SA[i]] = cmp(y, SA[i - 1], SA[i], j) ? p - 1 : p++;
            }
            if (p >= n)break;
            m = p;
        }

        int k = 0;
        n--;
        for (i = 0; i <= n; ++i) Rank[SA[i]] = i;
        for (i = 0; i < n; ++i) {
            if (k)--k;
            j = SA[Rank[i] - 1];
            while (str[i + k] == str[j + k])++k;
            Height[Rank[i]] = k;
            //cout << k << endl;
        }
    }
    static const int bitlen = 25;
    LL lg2(LL p)//计算log2(n)
    {
        return (LL)(log(p) / log(2));
    }
    LL dp[bitlen][N];
    LL bit[bitlen];
    void initRMQ()//初始化
    {
        bit[0] = 1;
        for (int i = 1; i < bitlen; i++) bit[i] = 2 * bit[i - 1];
        for (int i = 0; i <= slen; i++)
            dp[0][i] = Height[i];
        dp[0][0] = dp[0][1] = 0;
        for (LL i = 1; bit[i] < slen + 1; i++)
            for (LL j = 0; j + bit[i] <= slen + 1; j++)
                dp[i][j] = min(dp[i - 1][j], dp[i - 1][j + bit[i - 1]]);
    }
    LL query(LL l, LL r)//查询两个Rank之间的lcp
    {
        if (r == l) return slen - SA[l];
        if (l > r) swap(l, r);
        l++;
        LL mig = lg2(r - l + 1.0);
        return min(dp[mig][l], dp[mig][r - bit[mig] + 1]);
    }
    void init(string &s)
    {
        slen = s.size();
        m=1050;//每次都需要初始化m
        for (int i = 0; i < slen; i++)
            str[i] = s[i] - 'a' + 2;//如果是字符,映射成从1开始的序列
        str[slen] = 1;//1作为结束符,防止越界
        Suffix(slen);
        initRMQ();
    }
}sf;

 

转载于:https://www.cnblogs.com/LukeStepByStep/p/7821583.html

考虑柔性负荷的综合能源系统低碳经济优化调度【考虑碳交易机制】(Matlab代码实现)内容概要:本文围绕“考虑柔性负荷的综合能源系统低碳经济优化调度”展开,重点研究在碳交易机制下如何实现综合能源系统的低碳化与经济性协同优化。通过构建包含风电、光伏、储能、柔性负荷等多种能源形式的系统模型,结合碳交易成本与能源调度成本,提出优化调度策略,以降低碳排放并提升系统运行经济性。文中采用Matlab进行仿真代码实现,验证了所提模型在平衡能源供需、平抑可再生能源波动、引导柔性负荷参与调度等方面的有效性,为低碳能源系统的设计与运行提供了技术支撑。; 适合人群:具备一定电力系统、能源系统背景,熟悉Matlab编程,从事能源优化、低碳调度、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究碳交易机制对综合能源系统调度决策的影响;②实现柔性负荷在削峰填谷、促进可再生能源消纳中的作用;③掌握基于Matlab的能源系统建模与优化求解方法;④为实际综合能源项目提供低碳经济调度方案参考。; 阅读建议:建议读者结合Matlab代码深入理解模型构建与求解过程,重点关注目标函数设计、约束条件设置及碳交易成本的量化方式,可进一步扩展至多能互补、需求响应等场景进行二次开发与仿真验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值