再做几个字典树就去AC自动机...... 加油!
用模板感觉不错啊!!细节细节!!
#include<iostream>
#include<string>
#include<cstdio>
#define MAX 26
using namespace std;
struct TireNode
{
int nCount;
TireNode *next[MAX];
};
TireNode Memeroy[1111111];
int allocp=0;
void InitTireRoot( TireNode **pRoot )
{
*pRoot=NULL;
}
TireNode *CreateTire()
{
int i,k;
TireNode *p=&Memeroy[allocp++];
p->nCount=1;
for( i=0;i<MAX;i++ )
p->next[i]=NULL;
return p;
}
void InsertTire( TireNode **Root,char *s )
{
int i=0,k;
TireNode *p;
if( !(p=*Root) )
p=*Root=CreateTire();
while( s[i] )
{
k=s[i++]-'a';
if( p->next[k] )
p->next[k]->nCount++;
else
p->next[k]=CreateTire();
p=p->next[k];
}
}
void SearchTire( TireNode **Root,char *s )
{
int i=0,k;
TireNode *p=*Root;
while( s[i] )
{
printf( "%c",s[i] );
k=s[i++]-'a';
if( p->next[k] && p->next[k]->nCount==1 )
return ;
p=p->next[k];
}
}
int main()
{
//freopen( "write.out","w",stdout );
//freopen( "read.in","r",stdin );
TireNode *Root;
InitTireRoot(&Root);
int k=0;
char s[1111][22];
while( scanf("%s",s[k])!=EOF )
InsertTire(&Root,s[k++]);
for( int i=0;i<k;i++ )
{
printf( "%s ",s[i] );
SearchTire(&Root,s[i]);
printf( "\n" );
}
return 0;
}