POJ 2406 Power String 最短循环子串 - KMP
2017-06-11 19:35
288 查看
传送门
题目大意:求循环子串的最短循环节。
题解:首先注意到如果他是循环子串那么n-next
一定是最小循环节。
于是可以先求出nxt然后暴力匹配一遍看看。
但是事实上只要满足n%(n-next
)==0就可以保证答案正确了。可以用类似递归的方式证明。
代码:#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000010
using namespace std;
int nxt[MAXN];
char s[MAXN];
int get_nxt(char *s,int n)
{
nxt[1]=0;
for(int i=2;i<=n;i++)
{
int j=nxt[i-1];
while(j&&s[j+1]!=s[i]) j=nxt[j];
if(s[j+1]==s[i]) j++;
nxt[i]=j;
}
return 0;
}
int main()
{
s[0]='#';
while(scanf("%s",s+1)!=EOF)
{
int n=strlen(s)-1;
if(n==1&&s[1]=='.') break;
get_nxt(s,n);int k=n-nxt
;
if(n%k) printf("1\n");
else printf("%d\n",n/k);
}
return 0;
}
题目大意:求循环子串的最短循环节。
题解:首先注意到如果他是循环子串那么n-next
一定是最小循环节。
于是可以先求出nxt然后暴力匹配一遍看看。
但是事实上只要满足n%(n-next
)==0就可以保证答案正确了。可以用类似递归的方式证明。
代码:#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1000010
using namespace std;
int nxt[MAXN];
char s[MAXN];
int get_nxt(char *s,int n)
{
nxt[1]=0;
for(int i=2;i<=n;i++)
{
int j=nxt[i-1];
while(j&&s[j+1]!=s[i]) j=nxt[j];
if(s[j+1]==s[i]) j++;
nxt[i]=j;
}
return 0;
}
int main()
{
s[0]='#';
while(scanf("%s",s+1)!=EOF)
{
int n=strlen(s)-1;
if(n==1&&s[1]=='.') break;
get_nxt(s,n);int k=n-nxt
;
if(n%k) printf("1\n");
else printf("%d\n",n/k);
}
return 0;
}
相关文章推荐
- POJ 2406 Power Strings——kmp求最短循环子串
- poj 2406 Power Strings(KMP求最大循环次数)
- 【poj-2406-powerstring】(KMP)
- poj_2406 Power Strings(KMP求周期子串)
- poj 2406 power string(KMP)
- POJ 2406 Power String(KMP)
- poj 2406 Power Strings(KMP求循环次数)
- POJ2406_Power Strings_KMP_求最短重复子序列
- POJ 2406 Power Strings kmp求循环结
- POJ - 2406 Power Strings解题报告(KMP,字符串划分成若干连续相同子串)
- POJ 2406 Power Strings(KMP求一个串的重复子串)
- POJ 2406-Power Strings(重复子串-KMP中的next数组)
- POJ 2406 Power String(KMP)
- poj(2406)求最短重复子串-KMP
- poj 2406 Power String (KMP)
- poj 2406 Power Strings(kmp求一个串的重复子串)
- POJ-2406 Power Strings(KMP求重复子串出现的最大次数)
- POJ 2406 Power Strings(KMP的应用)
- poj 2406 Power Strings(KMPnext性质)
- poj 2406 Power Strings(kmp应用)