思路:
就是字典树的模板题,整行输入,然后判断一下结束。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000002;
int Tire[maxn][26];
int tot=1,val[maxn]={0};
void Ins(char str[]){
int i,x,u = 0;
for(i=0;str[i]>='a'&&str[i]<='z';i++){
x = str[i]-'a';
if(Tire[u][x]==0) Tire[u][x] = tot++;
u = Tire[u][x];
val[u]++;
}
}
int query(char str[]){
int u = 0,x,i;
for(i=0;str[i]>='a'&&str[i]<='z';i++){
x = str[i]-'a';
if(Tire[u][x]==0) return 0;
u = Tire[u][x];
}
return val[u];
}
int main(void)
{
char ss[50];
while(1){
fgets(ss,maxn,stdin);
if(!(ss[0]>='a'&&ss[0]<='z')) break;
Ins(ss);
}
while(~scanf("%s",ss)){
printf("%d\n",query(ss));
}
return 0;
}
思路:记录每次的次数,找到第一个被标记次数为1的位置,然后返回。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5;
char ss[1200][26];
int tot,val[maxn],path[120],Tire[maxn][30];
void Init(){
memset(val,0,sizeof(val));
memset(Tire,0,sizeof(Tire));
tot = 1;
}
void Ins(char *str){
int i,x,u = 0;
for(i=0;str[i]>='a'&&str[i]<='z';i++){
x = str[i]-'a';
if(!Tire[u][x]) Tire[u][x] = tot++;
u = Tire[u][x];
val[u]++;
}
}
int query(char *str){
int i,x,u = 0,j = 0;
for(i=0;str[i]>='a'&&str[i]<='z';i++){
x = str[i]-'a';
u = Tire[u][x];
if(val[u]==1) return i;
}
return i-1;
}
int main(void)
{
Init();
int n=0,i,x,j;
while(~scanf("%s",ss[n])){
Ins(ss[n]);n++;
}
//printf("%d\n",n);
for(i=0;i<n;i++){
printf("%s ",ss[i]);
x = query(ss[i]);
for(j=0;j<=x;j++) printf("%c",ss[i][j]);
printf("\n");
}
return 0;
}