测谎通常使用一套准备好的问题提问被测试者,通过分析被测试者的反应得到结果。比较高级的测谎技术会使用测谎仪,监视被测试者的生理活动状况。我们这里的简易测谎则是通过对问题答案的特征分析来做出判断。
首先我们要求被测试者做完 N 道单选题,每道题有 8 个选项,由小写英文字母 a - h 来表示。这样就得到一个长度为 N 的、由 a - h 小写英文字母组成的字符串。对每个字符串打分,得分超过某个给定阈值 T 的就判断为“疑似说谎者”。打分原则如下:
以 f 开头的,得分 −2;
以 a 结尾的,得分 −1;
对于每一段长度大于 5 的连续选择同一字母的最长子串,得分 +3;
a 后面紧跟 e 或 h 的,得分 −4;
对于每一段长度大于 3 的连续选择相邻递增字母的最长子串(例如 abcd 或 defgh),得分 +5。
本题就请你写程序完成对被测试者的判断。
输入格式:
输入第一行给出 3 个正整数:N(6≤N≤100)为测谎问卷的题目数;T (≤100)为判断说谎的得分阈值;K(≤100)为被测试者人数。
随后 K 行,每行给出一个被测试者的答案字符串。
输出格式:
对每个被测试者的答案,在一行中输出其得分。如果分数超过阈值,则在其分数后输出 !!!。
输入样例:
12 1 6
fghaebcdeddd
ahhhhhhgbaaa
cdefffffffff
fffffghecaaa
feeeeeeeegcb
aaaaaabbbbbb
输出样例:
-1
-2
8!!!
-3
1
6!!!
解题思路:按照题目给出的5个条件,逐条判断是否满足,然后进行分数的加减即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,t,k;
cin>>n>>t>>k;
for(int i=0;i<k;i++)
{
int score = 0;
string s;
cin>>s;
if(s[0]=='f') //第一个条件
score=score-2;
if(s[n-1]=='a') //第二个条件
score=score-1;
int j = 0;
while(j<(int)s.length()) //第三个条件
{
char c = s[j];
int x = j+1;
while(s[x]==c)
x++;
if(x-j>5)
{
score = score+3;
}
j = x;
}
for(int j=0;j<(int)s.length();j++) //第四个条件
{
if(s[j]=='a'&&(s[j+1]=='e'||s[j+1]=='h'))
score = score-4;
}
for(int j=0;j<(int)s.length()-4;j++) //第五个条件,只要超过4个就可以+5分
{
if(s[j+1]==s[j]+1)
{
if(s[j+2]==s[j+1]+1)
{
if(s[j+3]==s[j+2]+1)
{
score = score+5;
}
}
}
}
if(score>t)
cout<<score<<"!!!"<<endl;
else
cout<<score<<endl;
}
}