题意:找出由两个字符串拼起来的字符串输出
暴力搜索切点分开字符串,查找有没有两断都存在的
通过字符串hash散列
AC代码
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct Hash
{
int hash[50500];
int head[50500];
int next[50500];
int mod=10007;
char mp[50500][20];
void init()
{
memset(hash,0,sizeof(hash));
memset(head,-1,sizeof(head));
memset(next,-1,sizeof(next));
}
int get_hash(char *s)
{
int seed=131;
int h=0;
for(int i=0;s[i];i++)
{
h=((h*seed)%mod+(s[i]-'a'))%mod;
}
return h;
}
void add_hash(int s)
{
int h=get_hash(mp[s]);
next[s]=head[h];
head[h]=s;
}
bool vj(char *s)
{
int h=get_hash(s);
h=head[h];
while(h!=-1)
{
if(strcmp(s,mp[h])==0)
return true;
h=next[h];
}
return false;
}
}T;
int main()
{
int cnt=0;
T.init();
while(scanf("%s",T.mp[cnt])&&T.mp[cnt][0]!='\0')
{
T.add_hash(cnt);
cnt++;
}
char s1[20],s2[20];
for(int i=0;i<cnt;i++)
{
int flog=0;
for(int j=0;j<T.mp[i][j+1]!='\0';j++)
{
s1[j]=T.mp[i][j];
s1[j+1]='\0';
if(T.vj(s1))
{
int k;
for(k=0;T.mp[i][j+k+1]!='\0';k++)
s2[k]=T.mp[i][j+k+1];
s2[k]='\0';
if(T.vj(s2))
{
printf("%s\n",T.mp[i]);
flog=1;
break;
}
}
if(flog)
break;
}
}
}