问题 H: 聊天止于呵呵
时间限制: 5 Sec 内存限制: 128 MB题目描述
(现代版)俗话说:流言止于智者,聊天止于呵呵。输入一段聊天记录,你的任务是数一数有 多少段对话“止于呵呵”,即对话的最后一句话包含单词 hehe或者它的变形。
具体来说,我们首先提取出对话的最后一句话,把所有非字母的字符替换成空格,把所有字符 替换成小写,然后导出一个单词列表(由空格隔开),只要列表中的任何一个单词是 hehe,这 段对话就算作“止于呵呵”。比如,"Hi! Are you OK?" 会变成四个单词:hi, are, you, ok。注 意,单词列表可以是空的(比如,这句话是:"?!?!!")
有些人喜欢使用 hehe的变形,这些变形也应被视为“呵呵”。为了简单起见,本题只考虑由 n(n>1)个 he连接而成的单词,比如 hehehe或者 hehehehe。注意,以 hehe为连续子串的其他单 词不应视为“呵呵”,比如 hehee,或者 ehehe。
每两个不同人之间的所有对话算作“一段对话”。
具体来说,我们首先提取出对话的最后一句话,把所有非字母的字符替换成空格,把所有字符 替换成小写,然后导出一个单词列表(由空格隔开),只要列表中的任何一个单词是 hehe,这 段对话就算作“止于呵呵”。比如,"Hi! Are you OK?" 会变成四个单词:hi, are, you, ok。注 意,单词列表可以是空的(比如,这句话是:"?!?!!")
有些人喜欢使用 hehe的变形,这些变形也应被视为“呵呵”。为了简单起见,本题只考虑由 n(n>1)个 he连接而成的单词,比如 hehehe或者 hehehehe。注意,以 hehe为连续子串的其他单 词不应视为“呵呵”,比如 hehee,或者 ehehe。
每两个不同人之间的所有对话算作“一段对话”。
输入
输入仅包含一组数据,每行是一句对话,格式为:
人名 1->人名 2: 一句话.
每行最多包含 1000个字符,最多 100行。
人名 1->人名 2: 一句话.
每行最多包含 1000个字符,最多 100行。
输出
输出“止于呵呵”的对话段落所占的百分比,四舍五入到最近的整数。输入数据保证答案不会 同时和两个整数最近。
样例输入
A->B: Hello!
A->C: Hi!
B->A: Hehe
B->D: Hei!
D->B: How are you?
A->C: Hi???
A->C: Are you there?
B->D: Hehehei!
D->B: What does hehehei mean?
F->E: I want to hehehehehe yah.
A->C: Hi!
B->A: Hehe
B->D: Hei!
D->B: How are you?
A->C: Hi???
A->C: Are you there?
B->D: Hehehei!
D->B: What does hehehei mean?
F->E: I want to hehehehehe yah.
样例输出
50%
提示
样例解释
A 和 B 之间的最后一句话是"Hehe".
A 和 C 之间的最后一句话是"Are you there?".
B 和 D 之间的最后一句话是"What does hehehei mean?".
E 和 F 之间的最后一句话是"I want to hehehehehe yah". 最后第一段和最后一段话是“止于呵呵”的(注意最后一段对话是以呵呵的变种结束),因此 比例是 50%。
分析:
还是比较水的一个题目 既然找最后一句话倒着找第一句就 ok
AC代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include<list>
#include <bitset>
#include <climits>
#include <algorithm>
#define gcd(a,b) __gcd(a,b)
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
typedef long long LL;
const LL mod=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
using namespace std;
char str[105][1005];
char *Sep=" ";
char *p;
int main(){
int len=0;
//FIN;
while (gets(str[len])){
len++;
}
for (int i=0;i<len;i++){// 预处理成只含小写字母的字符串
for (int j=5;j<strlen(str[i]);j++){
if (str[i][j]>='A'&&str[i][j]<='Z'){
str[i][j]+=32;
}
else if (!(str[i][j]>='a'&&str[i][j]<='z')){
str[i][j]=' ';
}
}
}
int sum=0;
char tt[105][10];
int ll=0;
for (int i=len-1;i>=0;i--){
char temp[10];
temp[0]=str[i][0];
temp[1]=str[i][3];
if (temp[0]>=temp[1]) swap(temp[0],temp[1]);
temp[2]='\0';
int ff=1;
for (int k=0;k<ll&&ff;k++){// 判重
if (strcmp(tt[k],temp)==0){
ff=0;
}
}
if (ff==0)
continue;
strcpy(tt[ll++],temp);
p=strtok(str[i]+5,Sep);
if (p==NULL)
continue;
do{ // 单个单词是否符合要求
if (strlen(p)%2)
continue;
int flag=1;
for (int j=0;j<strlen(p)&&flag;j+=2){
if (p[j]=='h'&&p[j+1]=='e')
flag=1;
else flag=0;
}
if (flag){
sum++;
break;
}
}while ((p=strtok(NULL,Sep)));
}
printf ("%.0f%%\n",(1.0*sum/ll)*100);
return 0;
}