HDU1358 Period

Period

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2766    Accepted Submission(s): 1368



Problem Description
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as AK , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
 

Input
The input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on it.
 

Output
For each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
 

Sample Input
3 aaa 12 aabaabaabaab 0
 

Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
 
题意:输入一串长度为n的字符串,要求求出每个前缀的最短循环节。。
分析:通过这个题目对KMP的next更加熟悉了,KMP的next数组就是i位置的后缀字符串和他的前缀字符串相等的最长长度。比如aaba,对应位置是1,2,3,4,若果当前位置是3,第一个位置的a不等于第三个位置的c,所以next[3]=0;位置是4的话,第四个位置的a与第一个位置的a相等,所以next[4]=1;注意next存放的是最大的匹配长度,如果长度不为1,那么匹配就是t1,t2......t(k)与t(i-k+1),t(i-k+2).......t(i)。相等,k就是next里的值。。求出next之后i-next表示i和next[i]之间有多少个字母,这就是循环节

#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=1000010;
char s[MAXN];
int n;
int next[MAXN];
int main()
{
    int i,flag=1;
    while(scanf("%d",&n)==1&&n)
    {
        scanf("%s",s+1);
        next[1]=0;
        int k=0;
        for(i=2;i<=n;i++)
        {
            while(k&&s[i]!=s[k+1])
                k=next[k];
            if(s[k+1]==s[i])
                k++;
            next[i]=k;
        }
        printf("Test case #%d\n",flag++);
        for(i=2;i<=n;i++)
        {
            if(i%(i-next[i])==0&&i/(i-next[i])!=1)
                printf("%d %d\n",i,i/(i-next[i]));
        }
        printf("\n");
    }
    return 0;
}



计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统与大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型与激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参与电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学与科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑与算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值