标签:
Time Limit: 2 second(s) | Memory Limit: 32 MB |
As you probably know, the human information processor is a wonderful text recognizer that can handle even sentences that are garbled like the following:
The ACM Itrenntaoial Clloegaite Porgarmmnig Cnotset (IPCC) porvdies clolgee stuetnds wtih ooppriuntetiis to itnrecat wtih sutednts form ohetr uinevsrtieis.
People have claimed that understanding these sentences works in general when using the following rule: The first and last letters of each word remain unmodified and all the characters in the middle can be reordered freely. Since you are an ACM programmer, you immediately set on to write the following program: Given a sentence and a dictionary of words, how many different sentences can you find that could potentially be mapped to the same encoding?
Input starts with an integer T (≤ 20), denoting the number of test cases.
Each case starts with a line containing the number n (0 ≤ n ≤ 10000) of words in the dictionary, which are printed on the following n lines. After this, there is a line containing the number m (0 ≤ m ≤ 10000)of sentences that should be tested with the preceding dictionary and then m lines containing those sentences. The sentences consist of letters from a to z, A to Z and spaces only and have a maximal length of10000 characters. For each word in the dictionary a limitation of 100 characters can be assumed. The words are case sensitive. In any case, total number of characters in the sentences will be at most 105. And total characters in the dictionary will be at most 105.
For each case, print the case number first. Then for each sentence, output the number of sentences that can be formed on an individual line. Result fits into 32 bit signed integer.
Sample Input |
Output for Sample Input |
1 8 baggers beggars in the blowed bowled barn bran 1 beggars bowled in the barn |
Case 1: 8 |
Dataset is huge, use faster I/O methods.
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<queue> 6 #include<stack> 7 #include<map> 8 #include<math.h> 9 #include<stack> 10 using namespace std; 11 typedef long long LL; 12 char str[105]; 13 char bb[100006]; 14 char ak[105]; 15 void in(char *v); 16 int ask(char *vv); 17 int tree[100006][52]; 18 int val[100006]; 19 int nn=0; 20 int sk=1; 21 int main(void) 22 { 23 int i,j,k; 24 scanf("%d",&k); 25 int s; 26 for(s=1; s<=k; s++) 27 { 28 int n,m;sk=1; 29 memset(tree,-1,sizeof(tree)); 30 memset(val,0,sizeof(val)); 31 scanf("%d ",&n); 32 for(i=0; i<n; i++) 33 { 34 scanf("%s",str); 35 int l=strlen(str); 36 if(l>=3) 37 sort(str+1,str+l-1); 38 str[l]=‘\0‘; 39 in(str); 40 } 41 scanf("%d",&m); 42 printf("Case %d:\n",s); 43 getchar(); 44 while(m--) 45 { 46 gets(bb); 47 if(bb[0]==‘\0‘)printf("1\n"); 48 else 49 { 50 int l=strlen(bb); 51 int uu=0; 52 int flag=0; 53 LL sum=1; 54 bb[l]=‘ ‘; 55 for(i=0; i<=l; i++) 56 { 57 if(bb[i]!=‘ ‘) 58 { 59 flag=1; 60 ak[uu++]=bb[i]; 61 } 62 else if(flag==1&&bb[i]==‘ ‘) 63 { 64 flag=0; 65 ak[uu]=‘\0‘; 66 if(uu>=3) 67 sort(ak+1,ak+uu-1); 68 sum*=(LL)ask(ak); 69 uu=0; 70 } 71 } 72 printf("%lld\n",sum); 73 } 74 } 75 } 76 return 0; 77 } 78 void in(char *v) 79 { 80 int l=strlen(v); 81 int i,j; 82 int cc; 83 int k=0; 84 for(i=0; i<l; i++) 85 { 86 if(v[i]>=‘A‘&&v[i]<=‘Z‘) 87 { 88 cc=v[i]-‘A‘+26; 89 } 90 else 91 cc=v[i]-‘a‘; 92 if(tree[k][cc]==-1) 93 { 94 tree[k][cc]=sk; 95 k=sk; 96 sk++; 97 nn++; 98 } 99 else k=tree[k][cc]; 100 } 101 val[k]++; 102 } 103 int ask(char *vv) 104 { 105 int l=strlen(vv); 106 int i,j; 107 int cc; 108 int ak=0; 109 for(i=0; i<l; i++) 110 { 111 if(vv[i]>=‘A‘&&vv[i]<=‘Z‘) 112 { 113 cc=vv[i]-‘A‘+26; 114 } 115 else 116 cc=vv[i]-‘a‘; 117 if(tree[ak][cc]==-1) 118 return 0; 119 ak=tree[ak][cc]; 120 } 121 return val[ak]; 122 }
标签:
原文地址:http://www.cnblogs.com/zzuli2sjy/p/5515956.html