题目链接:
http://poj.org/problem?id=1961
题目大意:
跟前面那题一样,只是这题要求出这个字符串里面所有的能够组成a^n形式的情况。
思路:
还是应用next数组,对于各种情况可以暴力枚举len,选取符合情况的。
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int min(int a,int b)
{
return a>b?a:b;
}
int next[1050005],a[1050005],b[1050005];
char s[1050005];
void GetNext(char* p,int next[],int l)
{
// memset(next,0,sizeof(next));
int pLen = l;
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen )
{
//p[k]表示前缀,p[j]表示后缀
if (k == -1 || p[j] == p[k])
{
++j;
++k;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int main()
{
int icase=0,l;
while(scanf("%d",&l)!=EOF)
{
if(l==0)break;
scanf("%s",s);
icase++;
if(s[0]=='.')break;
int x;
x=l;
GetNext(s,next,x);
int k=1;
while(1)
{
// printf("%d %d\n",next[x],x);
if(x%(x-next[x])==0&&next[x]!=0)
{
a[k]=x;
b[k]=x/(x-next[x]);
k++;
}
x--;
if(x==0)break;
}
printf("Test case #%d\n",icase);
for(int i=k-1;i>=1;i--)
printf("%d %d\n",a[i],b[i]);
printf("\n");
}
return 0;
}