POJ 3096 surprising_string (coding with STL <map> )

[Description]:

The D-pairs of a string of letters are the ordered pairs of letters that are distance D from each other. A string is D-unique if all of its D-pairs are different. A string is surprising if it is D-unique for every possible distance D.

Consider the string ZGBG. Its 0-pairs are ZG, GB, and BG. Since these three pairs are all different, ZGBG is 0-unique. Similarly, the 1-pairs of ZGBG are ZB and GG, and since these two pairs are different, ZGBG is 1-unique. Finally, the only 2-pair of ZGBG is ZG, so ZGBG is 2-unique. Thus ZGBG is surprising. (Note that the fact that ZG is both a 0-pair and a 2-pair of ZGBG is irrelevant, because 0 and 2 are different distances.)

Acknowledgement: This problem is inspired by the "Puzzling Adventures" column in the December 2003 issue of Scientific American.

[Input]:

The input consists of one or more nonempty strings of at most 79 uppercase letters, each string on a line by itself, followed by a line containing only an asterisk that signals the end of the input.

[Output]:

For each string of letters, output whether or not it is surprising using the exact output format shown below.

[Sample Input]:

ZGBG
X
EE
AAB
AABA
AABB
BCBABCC
*

[Sample Output]:

ZGBG is surprising.
X is surprising.
EE is surprising.
AAB is surprising.
AABA is surprising.
AABB is NOT surprising.
BCBABCC is NOT surprising
解题思想:从要求来看, 即定义 D-pairs 表示取字符串 s 中相距为 D 的两个字母所构成的字母对,该字母对中两个字母的位置顺序与他们在主串 s 中的位置顺序一致 定义 D-unique 表示,若从字符串 s 中取出所有相距为 D 的字母对 D-pairs ,且这些 D-pairs 都是独一无二的,那么成字符串 s 是一个 D-unique D 的取值范围为 0~s.len()-2。然后这个用map的键值对来标记结果检测时更为方便。当然C的flag标记方式也可以,总的来说在大神看来是道简单的poj题目。

souce_code: 

/*
 * =====================================================================================
 *
 *       Filename:  surprising_string.cpp
 *        Version:  1.0
 *        Created:  2013年10月13日 19时13分54秒
 *       Revision:  none
 *       Compiler:  g++
 *         Author:  szm
 *
 * =====================================================================================
 */

#include <iostream>
#include <string>
#include <map>
int main(int argc, char *argv[]){
	std::string s;
	while(std::getline(std::cin,s) && (s.c_str())[0]!='*'){
		if(s.size()<=2){
			std::cout<<s.c_str()<<" is surprising."<<std::endl;
			continue;
		}
		bool flag_final=true;
		for(int i=0;i<=(s.size()-2);i++){
			std::map<std::string,bool> mark;
			bool flag_unique=true;
			for(int j=0;j<=(s.size()-i-2);j++){
				char m_pair[3]={(s.c_str())[j],(s.c_str())[j+1+i],'\0'};
				std::string str(m_pair);
				if(!mark[str])
				      mark[str]=true;
				else{
					flag_unique=false;
					break;
				}
			}
			if(!flag_unique){
				flag_final=false;
				break;
			}
			mark.clear();
		}
		if(flag_final)
		      std::cout<<s<<" is surprising !"<<std::endl;
		else
		      std::cout<<s<<" is not surprising !"<<std::endl;
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值