T1 IMMEDIATE DECODABILITY poj 1056
题目大意:
一些数字串 求是否存在一个串是另一个串的前缀
思路:
对于所有串经过的点权+1 如果一个点的end被访问过或经过一个被标记为end的点 就存在
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #include<set> 10 #define inf 2139062143 11 #define ll long long 12 #define MAXN 15100 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 18 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 int n,tr[100][2],T,ans,vis[MAXN],sz,end[MAXN]; 22 char ch[15]; 23 void ins(char *c,int len) 24 { 25 int pos=0; 26 for(int i=0;i<len;i++) 27 { 28 if(!tr[pos][c[i]-'0']) tr[pos][c[i]-'0']=++sz; 29 pos=tr[pos][c[i]-'0'],vis[pos]++; 30 if(end[pos]) ans=1; 31 } 32 if(vis[pos]>1) ans=1;end[pos]=1; 33 } 34 int main() 35 { 36 while(scanf("%s",ch)!=EOF) 37 { 38 ans=sz=0;memset(vis,0,sizeof(vis)); 39 memset(tr,0,sizeof(tr));memset(end,0,sizeof(end)); 40 while(ch[0]!='9'){ins(ch,strlen(ch));scanf("%s",ch);} 41 if(!ans) printf("Set %d is immediately decodable\n",++T); 42 else printf("Set %d is not immediately decodable\n",++T); 43 } 44 }