您的位置:首页 > 其它

uva1262 Password【解法一】

2016-08-31 16:39 441 查看
Shoulder-surfing is the behavior of intentionally and stealthily

watching the screen of another person’s electronic device, such as

laptop computer or mobile phone. Since mobile devices prevail, it is

getting serious to steal personal information by shoulder-surfing.

Suppose that we have a smart phone. If we touch the screen keyboard

directly to enter the password, this is very vulnerable since a

shoulder-surfer easily knows what we have typed. So it is desirable to

conceal the input information to discourage shoulder-surfers around

us. Let me explain one way to do this. You are given a 6  5 grid.

Each column can be considered the visible part of a wheel. So you can

easily rotate each column wheel independently to make password

characters visible. In this problem, we assume that each wheel

contains the 26 upper letters of English alphabet. See the following

Figure 1. Figure 1. 6  5 window clips a valid grid representation for

a password. Assume that we have a length-5 password such as p 1 p 2 p

3 p 4 p 5 . In order to pass the authentication procedure, we should

construct a configuration of grid space where each p i appears in the

i

-th column of the grid. In that situation we say that the user password is accepted. Figure 2. A valid grid representation for

password ‘COMPU’. Let me start with one example. Suppose that our

password was set ‘COMPU’. If we construct the grid as shown in Figure

2 on next page, then the authentication is successfully processed. In

this password system, the position of each password charac- ter in

each column is meaningless. If each of the 5 characters in p 1 p 2 p 3

p 4 p 5 appears in the corresponding column, that can be considered

the correct password. So there are many grid configu- rations allowing

one password. Note that the sequence of letters on each wheel is

randomly determined for each trial and for each column. In practice,

the user is able to rotate each column and press “Enter” key, so a

should-surfer cannot perceive the password by observing the 6  5 grid

since there are too many password can- didates. In this 6  5 grid

space, maximally 6 5

= 7 ; 776 cases are possible. This is the basic idea of the proposed password system against shoulder-surfers. Unfortunately there is a

problem. If a shoulder-surfer can observe more than two grid plate

con- figurations for a person, then the shoulder-surfer can reduce the

searching space and guess the correct password. Even though it is not

easy to stealthily observe other’s more than once, this is one

weakness of implicit grid passwords. Let me show one example with two

observed configurations for a grid password. The user password is

‘COMPU’, but ‘DPMAG’ is also one candidate password derived from the

following configuration. Figure 3. Both of ‘COMPU’ and ‘DPMAG’ are

feasible password . You are given two configurations of grid password

from a shoulder-surfer. Suppose that you have succeeded to stealthily

record snapshots of the target person’s device (e.g. smart phone).

Then your next task is to reconstruct all possible passwords from

these two snapshots. Since there are lots of password candidates, you

are asked for the k

-th password among all candidates in lexicographical order. In Figure 3, let us show the first 5 valid password. The first 5 valid passwords

are ‘ABGAG’ , ‘ABGAS’, ‘ABGAU’, ‘ABGPG’ and ‘ABGPS’. The number k is

given in each test case differently. If there does not exist a k

-th password since k is larger than the number of all possible passwords, then you should print ‘ NO ’ in the output. Input Your

program is to read from standard input. The input consists of T test

cases. The number of test cases T is given in the first line of the

input. The first line of each test case contains one integer, K , the

order of the password you should find. Note that 1  K  7 ; 777 .

Next the following 6 lines show the 6 rows of the first grid and

another 6 lines represent the 6 rows of the second grid. Output Your

program is to write to standard output. Print exactly the k

-th password (including ‘ NO ’) in one line for each test case. The following shows sample input and output for three test cases.

解法二【暴力】见【这里】

字典序解码。

#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<char> v[7];
char s1[10][10],s2[10][10];
int k,n[7];
bool init()
{
int i,j,x,y,z;
for (i=1;i<=5;i++) v[i].clear();
scanf("%d",&k);
for (i=1;i<=6;i++)
scanf("%s",s1[i]+1);
for (i=1;i<=6;i++)
scanf("%s",s2[i]+1);
for (i=1;i<=5;i++)
for (j=1;j<=6;j++)
for (x=1;x<=6;x++)
if (s1[j][i]==s2[x][i])
v[i].push_back(s1[j][i]);
for (i=1;i<=5;i++)
{
if (v[i].empty()) return 0;
sort(v[i].begin(),v[i].end());
unique(v[i].begin(),v[i].end());
n[i]=0;
while (n[i]<v[i].size()-1&&v[i][n[i]+1]>v[i][n[i]]) n[i]++;
n[i]++;
}
return 1;
}
void solve()
{
int i,j,x,y,z,tot=1;
for (i=1;i<=5;i++)
tot*=n[i];
if (k>tot)
{
printf("NO\n");
return;
}
/*for (i=1;i<=5;i++)
{
tot/=n[i];
j=k/(tot+1);
printf("%c",v[i][j]);
k-=j*tot;
}*/
k--;
for (i=1;i<=5;i++)
{
tot/=n[i];
j=k/tot;
printf("%c",v[i][j]);
k-=j*tot;
}
printf("\n");
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
if (!init())
{
printf("NO\n");
continue;
}
solve();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  解码