Description
Input
Output
Sample Input
carbohydrate cart carburetor caramel caribou carbonic cartilage carbon carriage carton car carbonate
Sample Output
carbohydrate carboh cart cart carburetor carbu caramel cara caribou cari carbonic carboni cartilage carti carbon carbon carriage carr carton carto car carcarbonate carbona
题意:给你多个字符串,对每一个字符串你要用最简单但是确定代表这个字符串的前缀表示它。
思路:先把所有的字符串都插入到trie上,这个字符经过的节点val值都加1,那么一个字符的唯一前缀就是从它的头字符一直往后走,当节点val为1时就代表只有这个字符串,那么前缀就是之前的这些数,这里要注意前缀是祺本身的情况要特判。
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; typedef long long ll; const long double eps=1e-13; #define inf 99999999 #define pi acos(-1.0) #define maxn 5000 #define maxnode 50000 char s[maxn][30],str[maxn][30]; int val[maxnode]; int ch[maxnode][30]; int sz; void init() { sz=0; memset(ch[0],0,sizeof(ch[0])); memset(val,0,sizeof(val)); } int idx(char s){ return s-'a'; } void charu(char *s) { int u=0,i,j; int len=strlen(s); for(i=0;i<len;i++){ int c=idx(s[i]); if(!ch[u][c]){ sz++; ch[u][c]=sz; val[sz]++; u=sz; } else{ u=ch[u][c]; val[u]++; } } } int chazhao(char *s) { int i,j,u=0; int t,len=strlen(s); t=len-1; for(i=0;i<len;i++){ int c=idx(s[i]); if(val[ch[u][c] ]==1){ t=i;break; } u=ch[u][c]; } return t; } int main() { int n,m,i,j,tot; tot=0; init(); while(scanf("%s",s[++tot])!=EOF){ charu(s[tot]); } for(i=1;i<=tot;i++){ int k=chazhao(s[i]); for(j=0;j<=k;j++){ str[i][j]=s[i][j]; } str[i][j]='\0'; } for(i=1;i<=tot;i++){ printf("%s %s\n",s[i],str[i]); } }