Period

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 A K,that is A concatenated K times, for some string A. Of course, we also want to know the period K.
Input
The input 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




#include <iostream>
#include <cstdio>
#include <cstring>
const int MAX= 1e6+10;
int next[MAX];
char str[MAX];
void getnext(int  l)
{
	  int i = 0 , j = -1;
	  next[0] = -1;
	  while( i < l )
	  {
	  	     if(j == -1 || str[j] == str[i])
	  	      {
	  	      	    i++;
	  	      	    j++;
	  	      	    next[i] = j;
				}
			else
			  j = next[j];
	  }
}
int main()
{      
     int n , w = 1;
      while( ~scanf("%d",&n) && n )
      {    
            scanf("%s",str);
      	   int l = strlen(str);
      	     getnext(l);
      	     printf("Test case #%d\n", w++);
      	    for(int i = 0; i <= l; i++)
      	   {
      	 	    if(next[i] == 0)
      	 	      continue;
      	 	    if(i % (i - next[i]) == 0 && i / (i - next[i] ) > 1  )
      	 	     {
      	 	     	  printf("%d %d\n",i , i / (i - next[i]));
					}
		   }
		   printf("\n");
	  }
	  return 0;
}








<think>我们正在处理关于pandas Period功能的问题。根据用户意图,我们需要提供Period功能的使用指南。 引用内容提到:pandas使用Period对象表示标量值,使用PeriodIndex表示跨度序列。我们将围绕这些内容展开。 步骤: 1. 介绍Period的概念:表示一个时间跨度,如某个月、某个季度等。 2. 创建Period对象:使用`pd.Period`。 3. 创建PeriodIndex:使用`pd.period_range`。 4. 常用操作:属性访问、算术运算、转换等。 5. 示例代码。 注意:引用中提到的转换为时间戳[^1]和自定义索引[^2]虽然相关,但重点在Period,所以我们会适当关联。 根据引用[1]:pandas使用Period对象表示标量值,使用PeriodIndex表示跨度序列。我们将以此为基础。 生成相关问题: 1. Period对象如何转换为时间戳? 2. 如何创建PeriodIndex? 3. Period对象有哪些常用属性和方法? 4. Period在时间序列分析中有哪些应用?</think>### pandas Period功能使用指南 pandas的`Period`功能用于表示**固定频率的时间区间**(如某个月、某个季度等),是处理时间序列数据的核心工具。以下是关键使用指南: #### 1. **创建Period对象** ```python import pandas as pd # 创建单个时间段 p = pd.Period('2023-01', freq='M') # 表示2023年1月 print(p) # 输出: 2023-01 # 常用频率参数 # 'D': 日, 'M': 月, 'Q': 季度, 'A': 年, 'H': 小时 quarter = pd.Period('2023Q2', freq='Q') # 2023年第二季度 ``` #### 2. **Period属性操作** ```python print(p.start_time) # 区间起始时间: 2023-01-01 00:00:00 print(p.end_time) # 区间结束时间: 2023-01-31 23:59:59.999999999 print(p.freq) # 频率: <MonthEnd> print(p + 1) # 下个周期: 2023-02 ``` #### 3. **创建Period序列(PeriodIndex)** ```python # 生成时间范围 idx = pd.period_range('2023-01', '2023-06', freq='M') print(idx) # 输出: PeriodIndex(['2023-01', '2023-02', ..., '2023-06'], dtype='period[M]') # 结合Series使用 sales = pd.Series([120, 95, 110], index=idx) print(sales['2023-02']) # 输出: 95 ``` #### 4. **频率转换** ```python # 月周期转季度周期 p.asfreq('Q') # 输出: 2023Q1 (因1月属于Q1) # 批量转换 idx.to_period('Q') # 将月份序列转为季度序列 ``` #### 5. **与时间戳互转** ```python # Period → Timestamp ts = p.to_timestamp() # 转为时间戳: 2023-01-01 00:00:00 # Timestamp → Period pd.Timestamp('2023-01-15').to_period('M') # 输出: 2023-01 ``` #### 6. **实际应用场景** ```python # 按季度汇总数据 df = pd.DataFrame({ 'date': pd.date_range('2023-01-01', periods=90, freq='D'), 'sales': np.random.randint(50, 200, 90) }) # 转换为季度Period并分组 df['quarter'] = df['date'].dt.to_period('Q') print(df.groupby('quarter')['sales'].mean()) ``` #### 7. **注意事项** - **频率一致性**:进行算术运算时需确保频率相同,如`pd.Period('2023Q1') + pd.Period('2023Q2')`会报错 - **边界处理**:`end_time`包含该周期最后一刻,如月度周期的`2023-01-31 23:59:59.999999` - **时区处理**:通过`tz`参数指定时区,如`pd.Period('2023-01', freq='M', tz='Asia/Shanghai')` > 引用说明:pandas使用`Period`对象表示时间标量值,`PeriodIndex`表示时间跨度序列[^1]。这种设计允许在固定频率时间区间(如财务季度)和精确时间点(如交易时刻)之间灵活转换[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值