循环节
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
X最近爱上了一种奇怪的游戏,就是找出一个字符串中的最小循环节。
对于最小循环节的定义:对于字符串A存在字串B,使得A是由N个完整的B组成的,那么B就是A的一个循环节,长度最小的那一个为最小循环节。
输入
多组输入。
每组输入一个字符串,长度不大于80,只包含26个小写字母。
输出
输出一个字符串,代表最小循环节。
示例输入
aaaa abab
示例输出
a ab
很明显这是next数组应用的部分
if(len%(len-next[len]==0)) 说明有最小循环节,最小循环节长度为len-next[len] 否则没有最小循环节,即自身循环,此时结果就是它自己
#include <iostream> #include <algorithm> #include <string.h> #include <cstdio> #include <cctype> #include <cmath> #include <string> using namespace std; char t[102]; int next[102]; void get_next(char *t,int *next) { int i=0,j=-1,len=strlen(t); next[0]=-1; while(i<len) { if(j==-1||t[i]==t[j]) { ++i;++j; if(t[i]!=t[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } } int main() { //ios::sync_with_stdio(false); while(scanf("%s",t)!=EOF) { int len=strlen(t); get_next(t,next); int n=len-next[len]; if(len%n==0) { for(int i=0;i<n;i++) cout<<t[i]; cout<<endl; } else cout<<t<<endl; } return 0; }