标签:nsis each 前缀和 first kmp ever odi str lines
3 aaa 12 aabaabaabaab 0Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
题目意思是找出字符串中由两个或以上相同的子字符串组成的前缀,输出前缀长度及其中相同的子字符串的个数。
kmp next记录相同前缀和后缀的重叠,i - next[i]为子字符串大小,如果i能够被其整除,且除后结果不为1,就能输出。
代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> char str[1000000]; int next[1000000],n; void findnext() { int k = -1,i = 0; next[0] = -1; while(i<n){ if(str[i] == str[k] || k == -1) { i++; k++; next[i] = k; } else k = next[k]; } } int main() { int k = 1; while(~scanf("%d",&n)&& n) { scanf("%s",str); findnext(); printf("Test case #%d\n",k++); for(int i = 1;i <= n;i ++) { int temp=i-next[i]; if(i%temp==0 && i/temp>1) printf("%d %d\n",i,i/temp); } puts(""); } }
标签:nsis each 前缀和 first kmp ever odi str lines
原文地址:http://www.cnblogs.com/8023spz/p/7786887.html