Period

本文探讨了如何识别给定字符串前缀的周期性,包括输入解析、算法实现及输出格式,通过实例深入理解字符串周期性的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Period
Time Limit: 1000MS    Memory limit: 65536K

题目描述

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.
 

输入

 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.
 

输出

 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.
 

示例输入

3
aaa
12
aabaabaabaab
0

示例输出

Test case #1

2 2

3 3

Test case #2

2 2

6 2

9 3

12 4

这个题和 Power Strings其实是一个性质,只不过要把所有可能的子字符串写出来,只需在运行时只要有可能的就输出。。。

 

#include<stdio.h>
#include<string.h>
char t[110000000];
int next[11000000];
int main()
{
    int n,m,i,j,k;
    int len1,len2;
    int s=1;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        getchar();
        for(k=0; k<n; k++)
        {
            scanf("%c",&t[k]);
        }
        printf("Test case #%d\n",s++);
        i=0,j=-1;
        next[0]=-1;
        while(i<n)
        {
            if(j==-1||t[i]==t[j])
            {
                i++;
                j++;
                if(t[i]!=t[j]) next[i]=j;
                else next[i]=next[j];
                if(i%(i-j)==0&&i/(i-j)>1)
                {
                    int l=i/(i-j);
                    printf("%d %d\n",i,l);
                }
            }
            else j=next[j];
        }
        printf("\n");
    }
    return 0;
}

 

 

### Pandas Period 对象简介 `Period` 是 `pandas` 库中的一个重要时间序列数据类型,用于表示固定频率的时间间隔。这使得处理定期发生的数据变得非常方便。 #### 创建 Period 对象 可以使用 `pd.Period()` 函数来创建单个周期对象: ```python import pandas as pd period = pd.Period('2023-10', freq='M') print(period) ``` 这里指定了年月作为字符串,并通过参数 `freq` 明确了该期间的频率为月份[^1]。 #### 基础属性访问 一旦有了 `Period` 实例,就可以轻松获取其各种特性: - **year**: 获取所属年度。 - **month**: 如果适用,则返回具体哪个月份。 - **day**: 若涉及日级别精度则有效。 - **start_time/end_time**: 获得此时间段对应的起始时间和结束时间戳。 这些都可以像下面这样调用: ```python print(f"Year: {period.year}") print(f"Month: {period.month}") print(f"Start Time: {period.start_time}") print(f"End Time: {period.end_time}") ``` 对于更高频次的情况(比如天),还可以进一步细分到小时甚至分钟秒级。 #### 运算操作支持 值得注意的是,基于相同频率定义下的两个 `Period` 可以直接相加减得到新的 `PeriodIndex` 或者整数偏移量;而当与整型数值做加法时会按照指定频率移动相应次数的位置。 ```python next_period = period + 1 previous_period = period - 1 print(next_period) print(previous_period) ``` 上述代码展示了如何简单地增加或减少一个月形成下一个/上一个周期实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值