主题思想: 字典树 Tries
另外 c++ string sbustr( int start,int len) if len=-1 ,then until the end of the string
总结起来就是, c++ string substring 参数是起始位置,和长度
java String substr() 参数是起始位置,和结束位置下标,不包括结束下标
Tries 代码
const int R=26;
struct Node{
int val=-1;
struct Node* next[R];
Node(){
val=-1;
//very import
memset(next,NULL,sizeof(next));
}
};
Node* root;
int get(string key){
int d=0;
char c;
Node* x =root;
while(x!=NULL){
if(d==key.length()){ return x->val; }
c=key[d];
x=x->next[c-'a'];
d++;
}
return -1;
}
void put(string key,int val){
Node* x=root;
int d=0;
char c;
while(d<key.length()){
c=key[d];
//very important
if(x->next[c-'a']==NULL)
x->next[c-'a']=new Node();
d++;
x=x->next[c-'a'];
}
x->val=val;
}
AC代码:
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<cstdlib>
using namespace std;
const int maxn=50005;
string a[maxn];
const int R=26;
struct Node{
int val=-1;
struct Node* next[R];
Node(){
val=-1;
memset(next,NULL,sizeof(next));
}
};
Node* root;
int get(string key){
int d=0;
char c;
Node* x =root;
while(x!=NULL){
if(d==key.length()){ return x->val; }
c=key[d];
x=x->next[c-'a'];
d++;
}
return -1;
}
void put(string key,int val){
Node* x=root;
int d=0;
char c;
while(d<key.length()){
c=key[d];
if(x->next[c-'a']==NULL)
x->next[c-'a']=new Node();
d++;
x=x->next[c-'a'];
}
x->val=val;
}
int main()
{
string s;
int n=0;
root=new Node();
while(cin>>s){
a[n]=s;
n++;
put(s,n);
}
for(int i=0;i<n;i++){
int len=a[i].length();
for(int j=1;j<len;j++){
if(get(a[i].substr(0,j))!=-1&&get(a[i].substr(j))!=-1){
cout<<a[i]<<endl;
break;
}
}
}
return 0;
}