Identity Decode
Time Limit: 1 Second Memory Limit: 32768 KB
WishingBone met a ppmm in school today. He is really enthusiastic to know her name. The only information he's got is her school identity which is on her school bag. At night, WishingBone broke into the office of the principal, and found a long long list of all the students' names. It reads:
1: WishingBone ID: green_bone blue_bone red_bone
2: WishingMM ID: blue_bone green_bone red_bone
3: WishingFish ID: green_bone red_bone blue_bone
4: WashingBone ID: red_bone green_bone blue_bone
And he remembers the ppmm's ID is white_bone blue_bone greed_bone. Of course, he did not want to read the list through to find this ID. Well, fortunately, he found a piece of code in the recycled bin that the principle used to generate those ID's. This program reads in m and n, where m is the number of color of bones and n is the length of the ID. Then it reads in a list of colors and generates the list of possible ID's. Since WishingBone is quite poor at programming, he resorts to your help.
Input
Input consists of multiple tests. Each test starts with a line of m and n (0 < n <= m <= 12), and a list of m distinct names of colors on the next line, separated by a single space. Names are made up of up to 30 upper, lower Latin characters and the '_' character. The third line of a test contains a sequence of n names of colors, which is the school identity of the ppmm.
Process to the end of file. There will be no more than 10000 tests.
Output
For each test in the input, output a single integer - the line on which to find her name.
Sample Input
4 3 red_bone blue_bone green_bone white_bone red_bone green_bone blue_bone 4 3 red_bone blue_bone green_bone white_bone white_bone blue_bone green_bone
Sample Output
4 21 The Program WishingBone found in the pricipal's office: #include #define MAXN 12 void FAINT(int m,int n,int l,int a[MAXN][3],int t,char name[MAXN][50],int& c){ int i; if (!t--) for (cout<<++c<<": ",i=0;i cout< else for (i=0;i if (!a[i][2]) a[t][a[i][2]=1]=a[i][0],FAINT(m,n,l,a,t,name,c),a[i][2]=0; } void faint(int m,int n,int l,int a[MAXN][3],int t,char name[MAXN][50],int& c){ int i; if (t==n) FAINT(m,n,l,a,n,name,c); else for (i=l;i a[t][0]=i,faint(m,n,i+1,a,t+1,name,c); } int main(){ char name[MAXN][50]; int a[MAXN][3],m,n,i,c=0; cin>>m>>n; for (i=0;i cin>>name[i],a[i][2]=0; faint(m,n,0,a,0,name,c); return 0; } const maxn=12; type words=string[50]; var n,m,i:integer; name:array [1..maxn] of words; a,p:array [1..maxn] of integer; yes:array [1..maxn] of boolean; g:longint; procedure getwords(var s:words); var ch:char; function rec:boolean; begin rec:=(ch='_') or ('A'<=ch) and (ch<='Z') or ('a'<=ch) and (ch<='z'); end; begin s:='';repeat read(ch);until rec; repeat s:=s+ch;read(ch); until not rec; end; procedure print(l:integer); var i:integer; begin if l=0 then begin inc(g);write(g,':'); for i:=1 to m do write(' ',name[p[a[i]]]); writeln; end else for i:=1 to m do if yes[i] then begin yes[i]:=false;a[l]:=i;print(l-1);yes[i]:=true;end; end; procedure faint(nn,mm:integer); begin if mm=0 then print(m) else begin p[m-mm+1]:=n-nn+1; faint(nn-1,mm-1); if nn>mm then faint(nn-1,mm); end; end; begin read(n,m); for i:=1 to n do getwords(name[i]); fillchar(yes,sizeof(yes),1);g:=0; faint(n,m); end.Submit
Source: WishingBone's Contest #1