比赛 cmath生日赛 评测结果 AAAAAAAAAA
题目名称 鱼的感恩 最终得分 100
用户昵称 CSU_Turkey 运行时间 0.882 s
代码语言 C++ 内存使用 15.00 MiB
提交时间 2017-06-13 19:29:51
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int q,next[200005];
char s[200005],b[200005],c[200005],ghb;
inline void NEXT(char *s)
{
	int lens=strlen(s);
	next[0]=0;
	for(int i=1;i<lens;i++)
	{
		int k=next[i-1];
		while(k>0&&s[k]!=s[i])
		k=next[k-1];
		if(s[k]==s[i])next[i]=k+1;
		else next[i]=0;
	}
}
inline bool kmp(char *g,char *s)
{
	int leng=strlen(g);
	int lens=strlen(s);
	int book=0;
	NEXT(s);
	for(int i=0,q=0;i<leng;i++)
	{
		while(g[i]!=s[q]&&q>0)
		q=next[q-1];
		if(g[i]==s[q])q++;
		else q=0;
		if(q==lens)
		{
			book=1;
			q=next[q-1];
		}
	}
	return book;
}
int main()
{
	freopen("fool.in","r",stdin);
	freopen("fool.out","w",stdout);
	scanf("%d",&q);
	for(int j=1;j<=q;j++)
{
	ghb=0;
	scanf("%s",s);
	int len=strlen(s);
	NEXT(s);
//	for(int i=0;i<len;i++)cout<<next[i]<<" ";
    do
{	
    if(next[len-1]<1){
    	ghb=1;
	break;} 
	memset(c,0,sizeof(c));
   memset(b,0,sizeof(b));
    int m=0;
	for(int i=1;i<len-1;i++)
	b[m++]=s[i];
	for(int i=0;i<=next[len-1]-1;i++)c[i]=s[i];//printf("%s %s ",b,c);
	next[len-1]=next[next[len-1]-1];
}	
    while(!kmp(b,c));
	if(ghb)cout<<"---"<<endl;
   else printf("%s\n",c);
}
	return 0;
}