zp1825.cpp
来自「浙江大学acm在线判题器代码集。 本人在浙大acm判题器上的所有代码(心血) 」· C++ 代码 · 共 88 行
CPP
88 行
#include <stdio.h>
#include <string.h>
char st[120000][30];
int p[20000],r[20000];
int cal(char s[])
{
int t=27*27*(s[0]-'a');
if (s[1]!='\0')
{
t+=27*(s[1]-'a'+1);
if (s[2]!='\0')
t+=s[2]-'a'+1;
}
return t;
}
int main(int argc, char* argv[])
{
// FILE *in=fopen("zp1825.in","r");
// FILE *out=fopen("output.txt","w");
int n,t,k,i,ln,j,l;
char rt[4]="\0\0\0";
memset(p,-1,sizeof(p));
memset(r,0,sizeof(r));
n=0;
while (scanf("%s",st[n])>0)
{
t=cal(st[n]);
if (p[t]==-1)
p[t]=n;
else
r[t]++;
t-=t%27;
if (p[t]==-1)
p[t]=n;
else
r[t]++;
t-=t%729;
if (p[t]==-1)
p[t]=n;
else
r[t]++;
n++;
}
for (i=1;i<n;i++)
{
rt[0]=st[i][0];
ln=strlen(st[i]);
for (j=p[cal(rt)],t=strlen(st[j]);
j<i && j>=0;j++,t=strlen(st[j]))
if (ln>t && memcmp(st[j],st[i],t)==0)
{
k=cal(st[i]+t);
if (p[k]>=0)
{
for (l=0;l<=r[k];l++)
if (ln-t==int(strlen(st[p[k]+l])))
if (memcmp(st[p[k]+l],st[i]+t,ln-t)==0)
break;
if (l<=r[k])
break;
}
}
if (j<i && j>=0)
printf("%s\n",st[i]);
}
//scanf("%s",st[0]);
return 0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?