比赛 |
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;
}