现在的位置: 首页 > 综合 > 正文

hdu3374最大最小表示+kmp

2019年08月20日 ⁄ 综合 ⁄ 共 818字 ⁄ 字号 评论关闭
#include<stdio.h>
#include<string.h>
#define maxn 1000010
char s[2*maxn];
int nxt[2*maxn];
int len;
int get(int flag)
{
	int i=1,j=2,k=0;
	while(i<=len&&j<=len&&k<=len)
	{
		int m=s[i+k]-s[j+k];
		if(!m)
			k++;
		else
		{
			if((m<0)^flag)
				j+=k+1;
			else
				i+=k+1;
			k=0;
			j+=(i==j);
		}
	}
	return i<j?i:j;
}
void gao(char * s,int n)
{
	nxt[1]=0;
	int k=0;
	for(int i=2;i<=n;i++)
	{
		while(k>0&&s[i]!=s[k+1])
			k=nxt[k];
		if(s[i]==s[k+1])
			k++;
		nxt[i]=k;
	}
}
int kmp(char *p)
{
	int n=2*len;
	int k=0,j=0;
	for(int i=2;i<=n;i++)
	{
		while(j>0&&s[i]!=p[j+1])
			j=nxt[j];
		if(s[i]==p[j+1])
		j++;
		if(j==len)
		{
			k++;
			j=nxt[j];
		}
	}
	return k;
}
int main()
{
	while(scanf("%s",s+1)!=EOF)
	{
		int i,j,k;
		int n=strlen(s+1);
		if(n==1)
		{
			printf("1 1 1 1\n");
			continue;
		}
		len=n;
		for(i=1;i<=n;i++)
			s[i+n]=s[i];
		int k1=get(0);
		int k2=get(1);
		//printf("%d %d\n",k1,k2);
		char *p1=s+k1-1,*p2=s+k2-1;
		gao(p1,n);
		int t1=kmp(p1);
		gao(p2,n);
		int t2=kmp(p2);
		printf("%d %d %d %d\n",k1,t1,k2,t2);
	}
	return 0;
}
【上篇】
【下篇】

抱歉!评论已关闭.