简单的字符串算法。出一个纯原创板子吧。
不要忘记字典树和哈希的联系。
HDU1251,计算相同前缀的数目。
1 #include<bits/stdc++.h> 2 #define scan(i) scanf("%d",&i) 3 #define pf printf 4 #define ll long long 5 #define f(i,a,b) for(int i=a;i<=b;i++) 6 using namespace std; 7 struct node{ 8 int num; 9 int child[26]; 10 }no[260005]; 11 int tot=0; 12 char tel[1005]; 13 void insert(char in[]){ 14 int len=strlen(in+1); 15 int init=0; 16 f(i,1,len){ 17 int tem=in[i]-'a'; 18 if(no[init].child[tem]==0){ 19 tot++; 20 no[init].child[tem]=tot; 21 init=tot; 22 } 23 else init=no[init].child[tem]; 24 no[init].num++; 25 } 26 } 27 int query(char in[]){ 28 int len=strlen(in+1); 29 int init=0; 30 f(i,1,len){ 31 int tem=in[i]-'a'; 32 if(no[init].child[tem]==0) return 0; 33 else init=no[init].child[tem]; 34 } 35 return no[init].num; 36 } 37 int main(){ 38 bool f=true; 39 while(cin.getline(tel+1,1005)){ 40 if(strcmp(tel+1,"")==0){ 41 f=false; 42 continue; 43 } 44 if(f==true){ 45 insert(tel); 46 } 47 else{ 48 pf("%d ",query(tel)); 49 } 50 } 51 }
HDU1671,判断是否存在两个字符串,其中一个字符串是另一个字符串的前缀。
1 #include<bits/stdc++.h> 2 #define scan(i) scanf("%d",&i) 3 #define pf printf 4 #define ll long long 5 #define f(i,a,b) for(int i=a;i<=b;i++) 6 using namespace std; 7 int t,n; 8 struct node{ 9 int num; 10 int child[10]; 11 }no[100005]; 12 int tot=0; 13 char tel[15]; 14 bool insert(char in[]){ 15 int len=strlen(in+1); 16 int init=0; 17 f(i,1,len){ 18 if(no[init].num==-2) return false; 19 int tem=in[i]-'0'; 20 if(no[init].child[tem]==0){ 21 tot++; 22 no[init].child[tem]=tot; 23 init=tot; 24 if(i-len) no[init].num=-1; 25 else no[init].num=-2; 26 } 27 else init=no[init].child[tem]; 28 } 29 if(no[init].num==-1) return false; 30 return true; 31 } 32 int main(){ 33 scan(t); 34 f(kk,1,t){ 35 scan(n); 36 bool f=true; 37 f(i,1,n){ 38 scanf("%s",tel+1); 39 if(f==true){ 40 if(insert(tel)==false){ 41 f=false; 42 } 43 } 44 } 45 if(f==true) puts("YES"); 46 else puts("NO"); 47 memset(no,0,sizeof(no)); 48 tot=0; 49 } 50 }