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