#include <stdio.h>
#include <string.h>
char a[ 100 ] [ 25 ] ;
char s[ 25 ] ;
bool check ( int n) {
int i, j;
for ( i = 0 ; i < n; i++ ) {
int len = strlen ( a[ i] ) ;
for ( j = 0 ; j < len; j++ ) {
if ( s[ j] != a[ i] [ j] )
break ;
}
if ( j == len) {
return true ;
}
}
return false ;
}
int main ( ) {
int n, q;
scanf ( "%d%d" , & n, & q) ;
getchar ( ) ;
for ( int i = 0 ; i < n; i++ )
gets ( a[ i] ) ;
printf ( "输入要查询的单词\n" ) ;
while ( q-- ) {
gets ( s) ;
if ( check ( n) )
printf ( "存在\n" ) ;
else
printf ( "不存在\n" ) ;
}
}
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn= 1e5 + 10 ;
const int _size= 26 ;
struct node{
int w[ _size] ;
bool vis;
} trie[ maxn] ;
int cnt;
void insert ( char s[ ] ) {
int len= strlen ( s) , root= 0 , t;
for ( int i= 0 ; i< len; i++ ) {
t= s[ i] - 'a' ;
if ( trie[ root] . w[ t] == 0 ) trie[ root] . w[ t] = ++ cnt;
root= trie[ root] . w[ t] ;
if ( i+ 1 == len) {
trie[ root] . vis= true ;
}
}
}
void find ( char s[ ] ) {
int len= strlen ( s) , root= 0 ;
bool tis= true ;
for ( int i= 0 ; i< len; i++ ) {
if ( trie[ root] . w[ s[ i] - 'a' ] == 0 ) {
tis= false ;
break ;
}
root= trie[ root] . w[ s[ i] - 'a' ] ;
}
if ( trie[ root] . vis)
printf ( "存在\n" ) ;
else if ( ! trie[ root] . vis)
printf ( "不存在\n" ) ;
}
int main ( ) {
int n, q;
scanf ( "%d%d" , & n, & q) ;
getchar ( ) ;
char s[ 25 ] ;
for ( int i= 0 ; i< n; i++ ) {
gets ( s) ;
insert ( s) ;
}
printf ( "输入查询单词:\n" ) ;
while ( q-- ) {
gets ( s) ;
find ( s) ;
}
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
typedef long long ll;
const ll xmax= 1e6 + 100 ;
using namespace std;
int tree[ xmax] [ 26 ] , cnt, root, sum[ xmax] ;
void insert_ ( char s[ ] )
{
int t;
root= 0 ;
for ( int i= 0 ; s[ i] ; i++ )
{
t= s[ i] - 'a' ;
if ( tree[ root] [ t] == 0 ) tree[ root] [ t] = ++ cnt;
sum[ tree[ root] [ t] ] ++ ;
root= tree[ root] [ t] ;
}
}
int find_ ( char s[ ] )
{
int t;
int root= 0 ;
for ( int i= 0 ; s[ i] ; i++ )
{
t= s[ i] - 'a' ;
if ( tree[ root] [ t] == 0 ) return 0 ;
root= tree[ root] [ t] ;
}
return sum[ root] ;
}
int main ( )
{
char s[ xmax] , ask[ xmax] ;
while ( 1 )
{
gets ( s) ;
if ( s[ 0 ] == '\0' )
break ;
else
insert_ ( s) ;
}
while ( scanf ( "%s" , ask) != EOF )
{
int ans= find_ ( ask) ;
printf ( "%d\n" , ans) ;
}
return 0 ;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
typedef long long ll;
const int xmax= 1e5 + 100 ;
using namespace std;
int tree[ xmax* 32 ] [ 2 ] , cnt;
void init ( )
{
memset ( tree, 0 , sizeof ( tree) ) ;
cnt= 0 ;
}
void insert_ ( int x)
{
int t, root= 0 ;
for ( int i= 31 ; i>= 0 ; i-- )
{
t= ( x>> i) & 1 ;
if ( tree[ root] [ t] == 0 ) tree[ root] [ t] = ++ cnt;
root= tree[ root] [ t] ;
}
}
int find_ ( int x)
{
int t, sum= 0 , root= 0 ;
for ( int i= 31 ; i>= 0 ; i-- )
{
t= ! ( ( x>> i) & 1 ) ;
sum<<= 1 ;
if ( tree[ root] [ t] ) root= tree[ root] [ t] , sum++ ;
else root= tree[ root] [ ! t] ;
}
return sum;
}
int main ( )
{
int n, a[ xmax] ;
while ( ~ scanf ( "%d" , & n) )
{
init ( ) ;
int ans= - 1 ;
for ( int i= 1 ; i<= n; i++ )
{
scanf ( "%d" , & a[ i] ) ;
insert_ ( a[ i] ) ;
}
for ( int i= 1 ; i<= n; i++ )
{
ans= max ( ans, find_ ( a[ i] ) ) ;
}
printf ( "%d\n" , ans) ;
}
return 0 ;
}
Xor Sum
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
const ll xmax= 1e6 + 7 ;
using namespace std;
int tree[ xmax<< 1 ] [ 2 ] , cnt, root;
int a[ xmax] , b[ xmax] ;
void init ( )
{
memset ( tree, 0 , sizeof ( tree) ) ;
cnt= 0 ; root= 0 ;
}
void insert_ ( int x)
{
int t;
root= 0 ;
for ( int i= 31 ; i>= 0 ; i-- )
{
t= ( x>> i) & 1 ;
if ( tree[ root] [ t] == 0 ) tree[ root] [ t] = ++ cnt;
root= tree[ root] [ t] ;
}
}
int find_ ( int y)
{
int t, ans= 0 ;
int root= 0 ;
for ( int i= 31 ; i>= 0 ; i-- )
{
t= ! ( ( y>> i) & 1 ) ;
if ( tree[ root] [ t] ) ans+ = ( t* ( 1 << i) ) , root= tree[ root] [ t] ;
else ans+ = ( ! t* ( 1 << i) ) , root= tree[ root] [ ! t] ;
}
return ans;
}
int main ( )
{
int t;
scanf ( "%d" , & t) ;
for ( int i= 1 ; i<= t; i++ )
{
init ( ) ;
int n, m;
scanf ( "%d%d" , & n, & m) ;
for ( int j= 0 ; j< n; j++ )
{
scanf ( "%d" , & a[ j] ) ;
insert_ ( a[ j] ) ;
}
for ( int j= 0 ; j< m; j++ )
scanf ( "%d" , & b[ j] ) ;
printf ( "Case #%d:\n" , i) ;
for ( int j= 0 ; j< m; j++ )
{
int ans= find_ ( b[ j] ) ;
printf ( "%d\n" , ans) ;
}
}
return 0 ;
}