湖南省第十一届大学生计算机程序设计竞赛 Problem H 聊天止于呵呵(字符串处理)



问题 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。 
每两个不同人之间的所有对话算作“一段对话”。 

输入

输入仅包含一组数据,每行是一句对话,格式为:
人名 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.

样例输出

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;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值