码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4333 Revolving Digits

时间:2015-08-20 16:53:33      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

先用KMP问题结局循环节的问题,再用拓展kmp解决

#include<iostream>
#include<string>
#define maxn 200010
using namespace std;
string str,b;
int nextt[maxn],extend[maxn];
void get_next()
{
	int a=0;
	nextt[0]=b.size();
	while(a<b.size()-1&&b[a]==b[a+1]) a++;
	nextt[1]=a;
	a=1;
	for(int k=2;k<b.size();k++)
	{
		int p=a+nextt[a]-1;
		int l=nextt[k-a];
		if(k-1+l>=p)
		{
			int j=p-k+1>=0? p-k+1:0;
			while(k+j<b.size()&&b[k+j]==b[j]) j++;
			nextt[k]=j;
			a=k;
		}
		else nextt[k]=l;
	}
}
void get_extend()
{
	int a=0;
	extend[0]=str.size();
	while(a<b.size()&&str[a+1]==b[a]) a++;
	extend[1]=a;
	a=1;
	for(int k=2;k<str.size();k++)
	{
		int p=a+extend[a]-1;
		int l=nextt[k-a];
		if(k-1+l>=p)
		{
			int j=(p-k+1)>0? p-k+1:0;
			while(k+j<str.size()&&str[k+j]==b[j]&&j<b.size()) j++;
			extend[k]=j;
			a=k;
		}
		else extend[k]=l;
	}
}
int f(string m)
{
	int mnext[m.size()+1];
	mnext[0]=-1;
	int l=0,k=-1;
	while(l<m.size())
	{
		if(m[k]==m[l]||k==-1) mnext[++l]=++k;
		else k=mnext[k];
	}
	int temp=m.size()-mnext[m.size()];
	if(m.size()%temp==0) return m.size()/temp;
	else return 1;
} 
int main()
{
	cin.sync_with_stdio(false);
	int t;
	cin>>t;
	int casee=1;
	while(t--)
	{
		cin>>b;
		str=b+b;
		get_next();
		get_extend();
		int flag=f(b);
		int x=0,y=0,z=
		0;
		for(int i=0;i<b.size();i++)
		{
			if(extend[i]>=b.size()) y++;
			else
			{
				if(str[i+extend[i]]<b[extend[i]]) x++;
				else z++;
			}
		}
		cout<<"Case "<<casee++<<": "<<x/flag<<" "<<y/flag<<" "<<z/flag<<endl;
	}
	return 0;
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 4333 Revolving Digits

标签:

原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/47809389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!