题目大意
给你一个字符串,定义D-pair为在这个字符中间隔了D的两个字符组成的一对,如果这个字符串中对于相同的D,D-pair都是独特的话那么这个字符串就是surprising,让你判断一个字符串是否surprising。
分析
一个字符串最多长79,数据量不大,数据量大的话应该是要用hash的,为了方便就直接map来实现了,map更多是用来键值的查询,我的代码中通过count函数来判断对应的键(也就是一对字符)是否在map中存在。map的效率是树状结构的效率。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<map>
using namespace std;
const int INF=999999999;
string s;
void Work()
{
int len =s.size();
string t;
map<string,int> H;
for(int k=0;k<=len-2;k++)//间隔从0到len-2
{
for(int i=0;i<=len-k-2;i++)
{
t="";
t+=(char)s[i];
t+=s[i+k+1];
if(H.count(t)==1)//用count来判断是否存在这个序列
{
cout<<s<<" is NOT surprising."<<endl;
return ;
}
H[t]=1;
}
H.erase(H.begin(),H.end());//清空map
}
cout<<s<<" is surprising."<<endl;
}
int main()
{
while(cin>>s)
{
if(s[0]=='*')break;
Work();
}
return 0;
}