这个题...我实在是不知道0ms的程序是怎么搞的,
不过这个题的数据的确有点虚张声势==!
/*
pku 1200 crazy search
macro 还是要比函数快一些的...
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define SIZE 10000000
#define BUF_SIZE 1000
#define MAP_SIZE 200
#define ref_map(X) (!map[(X)]?(map[X]=imap++):map[(X)])
char buf[BUF_SIZE];
bool htable[SIZE];
int map[MAP_SIZE],imap=1;
int cnt=0;
int hash(char* s,int n,int nc,int p)
{
int i,j,sum=0;
for(i=0,j=p;j<n;i++,j++) /* i=0<=j */
sum=nc*sum+ref_map(s[j%n]);
for(j=0;i<n;i++,j++) /* 避免%运算 */
sum=nc*sum+ref_map(s[j%n]);
if(!htable[sum])
htable[sum]=1,cnt++;
return 0;
}
int main(void)
{
int n,nc,p=0; /* <- 采用循环数组防止溢出,p是个指针,指示缓冲区开始的位置 */
char c;
scanf("%d%d",&n,&nc);
getchar(); /* 跳过换行符 */
memset(htable,0,sizeof(htable));
fgets(buf,n+1,stdin);
hash(buf,n,nc,p);
while((c=getchar())!=EOF)
{
if(c=='\n') continue;
buf[p++]=c;
if(p==n) p=0; /* 循环数组的处理 */
hash(buf,n,nc,p);
}
printf("%d\n",cnt);
return 0;
}