POJ 3096 Surprising Strings(STL map string set vector)
题目:http://poj.org/problem?id=3096
题意:给定一个字符串S,从中找出所有有两个字符组成的子串,每当组成子串的字符之间隔着n字符时,如果没有相同的子串出现,则输出 "S is surprising." ,
反之,则输出 "S is NOT surprising." 。 例如 AABA 把它分成两个字符为一个整体的,1..相邻两个字符 AA,AB,BA 没有相同的; 2.隔一个字符的 AB AA 没有相同; 3.隔两个字符的 AA 没有相同
map:转载自:http://blog.csdn.net/lyy289065406/article/details/6648624
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <map> 7 #include <algorithm> 8 #define LL __int64 9 const int maxn = 1e3 + 100; 10 using namespace std; 11 12 int main() 13 { 14 int t, n, sum, v; 15 char s[200]; 16 while(~scanf("%d", &t)) 17 { 18 while(t--) 19 { 20 cin>>n; 21 sum = 0; 22 map<string, int>m1, m2; 23 map<string, int>::iterator it; 24 while(n--) 25 { 26 scanf("%s%d", s, &v); 27 if(m1[s]==0) m1[s] = v; 28 else if(m2[s]==0) 29 { 30 m2[s] = v; 31 if(m2[s]>m1[s]) 32 { 33 int tmp = m1[s]; 34 m1[s] = m2[s]; 35 m2[s] = tmp; 36 } 37 } 38 else 39 { 40 m2[s] = m2[s]>v?m2[s]:v; 41 if(m2[s]>m1[s]) 42 { 43 int tmp = m1[s]; 44 m1[s] = m2[s]; 45 m2[s] = tmp; 46 } 47 } 48 } 49 for(it = m1.begin(); it != m1.end(); it++) 50 sum += it->second; 51 for(it = m2.begin(); it != m2.end(); it++) 52 sum += it->second; 53 cout<<sum<<endl; 54 } 55 } 56 return 0; 57 }
1 /*STL<map>标记*/ 2 3 //Memory Time 4 //212K 16MS 5 6 #include<iostream> 7 #include<string> 8 #include<map> 9 using namespace std; 10 11 int main(void) 12 { 13 char s[80]; 14 while(cin>>s && s[0]!='*') 15 { 16 int len=strlen(s); 17 if(len<=2) //长度小于等于2的串必定是surprising String 18 { 19 cout<<s<<" is surprising."<<endl; 20 continue; 21 } 22 23 bool mark=true; //标记s是否为Surprising String 24 for(int d=0;d<=len-2;d++) //d为当前所选取的两个字母之间的距离,d(max)=len-2 25 { 26 map<string,bool>flag; 27 28 bool sign=true; //标记D-pairs字母对是不是D-unique 29 for(int i=0;i<=len-d-2;i++) //i为所选取的两个字母中第一个字母的下标 30 { 31 char pair[3]={s[i],s[i+d+1],'\0'}; //构成D-pairs字母对 32 33 if(!flag[ pair ]) 34 flag[ pair ]=true; 35 else 36 { 37 sign=false; //存在相同的D-pairs,该字母对不是D-unique 38 break; 39 } 40 } 41 if(!sign) 42 { 43 mark=false; //存在非D-unique,s不是Surprising String 44 break; 45 } 46 } 47 if(mark) 48 cout<<s<<" is surprising."<<endl; 49 else 50 cout<<s<<" is NOT surprising."<<endl; 51 } 52 return 0; 53 }
1 poj 2240 2 不是我写的代码,贴上是为了参考跌代器 3 #include<iostream> 4 #include<cstdio> 5 #include<cstring> 6 #include<map> 7 using namespace std; 8 struct node 9 { 10 int a,b; 11 double v; 12 } g[3500]; 13 int main() 14 { 15 int m,n,i,j,num=0; 16 double v,dis[3500]; 17 char money[10000],moneyt[10000]; 18 while(cin>>n&&n) 19 { 20 num++,n++; 21 map<string,int>mapp; 22 map<string,int>::iterator iter; //迭代器 23 for(i=1; i<n; i++) 24 { 25 cin>>money; 26 mapp.insert(pair<string,int>(money,i));//插入 27 } 28 cin>>m; 29 for(i=0; i<m; i++) 30 { 31 scanf("%s %lf %s",money,&v,moneyt); 32 iter=mapp.find(money); 33 g[i].a=iter->second; 34 g[i].v=v; 35 iter=mapp.find(moneyt); 36 g[i].b=iter->second; 37 } 38 memset(dis,0,sizeof(dis)); 39 dis[1]=1; 40 for(i=2; i<n; i++) 41 for(j=0; j<m; j++) 42 if(dis[g[j].b]<dis[g[j].a]*g[j].v) 43 dis[g[j].b]=dis[g[j].a]*g[j].v; 44 int flag=0; 45 for(j=0; j<m; j++) 46 if(dis[g[j].b]<dis[g[j].a]*g[j].v) 47 flag=1; 48 printf("Case %d: ",num); 49 if(flag) 50 printf("Yes\n"); 51 else 52 printf("No\n"); 53 } 54 return 0; 55 } 56 57
map的基本操作函数
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
C++ stl Multimap 和C++ stl map 很相似,但是MultiMap允许重复的元素。
Multimap应用举例:
1 //multimap允许重复的键值插入容器 2 // ********************************************************** 3 // * pair只包含一对数值:pair<int,char> * 4 // * map是一个集合类型,永远保持排好序的, * 5 // pair * map每一个成员就是一个pair,例如:map<int,char> * 6 // * map的insert()可以把一个pair对象作为map的参数,例如map<p> * 7 // *********************************************************** 8 #pragma warning(disable:4786) 9 #include<map> 10 #include<iostream> 11 using namespace std; 12 int main(void) 13 { 14 multimap<int,char*> m; 15 //multimap的插入只能用insert()不能用数组 16 m.insert(pair<int,char*>(1,"apple")); 17 m.insert(pair<int,char*>(1,"pear"));//apple和pear的价钱完全有可能是一样的 18 m.insert(pair<int,char*>(2,"banana")); 19 //multimap的遍历只能用迭代器方式不能用数组 20 cout<<"***************************************"<<endl; 21 multimap<int,char*>::iterator i,iend; 22 iend=m.end(); 23 for(i=m.begin();i!=iend;i++) 24 { 25 cout<<(*i).second<<"的价钱是" 26 <<(*i).first<<"元/斤n"; 27 } 28 cout<<"***************************************"<<endl; 29 //元素的反相遍历 30 multimap<int,char*>::reverse_iterator j,jend; 31 jend=m.rend(); 32 for(j=m.rbegin();j!=jend;j++) 33 { 34 cout<<(*j).second<<"的价钱是" 35 <<(*j).first<<"元/斤n"; 36 } 37 cout<<"***************************************"<<endl; 38 //元素的搜索find(),pair<iterator,iterator>equal_range(const key_type &k)const 39 //和multiset的用法一样 40 multimap<int,char*>::iterator s; 41 s=m.find(1);//find()只要找到一个就行了,然后立即返回。 42 cout<<(*s).second<<" " 43 <<(*s).first<<endl; 44 cout<<"键值等于1的元素个数是:"<<m.count(1)<<endl; 45 cout<<"***************************************"<<endl; 46 //删除 erase(),clear() 47 m.erase(1); 48 for(i=m.begin();i!=iend;i++) 49 { 50 cout<<(*i).second<<"的价钱是" 51 <<(*i).first<<"元/斤n"; 52 } 53 return 0; 54 }
string
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 string data; 6 7 bool solve(){ 8 if(data.size()<3) 9 return true; 10 int i,j; 11 for(int cnt=1;cnt<data.size();cnt++){ 12 for(i=0;i+cnt<data.size();i++){ 13 for(j=i+1;j+cnt<data.size();j++){ 14 if(data[i]==data[j] && data[i+cnt]==data[j+cnt]) 15 return false; 16 } 17 } 18 } 19 return true; 20 } 21 22 int main(){ 23 while(cin>>data,data!="*"){ 24 if(solve()) 25 cout<<data<<" is surprising."<<endl; 26 else 27 cout<<data<<" is NOT surprising."<<endl; 28 } 29 return 0; 30 } 31
string 的相关博客:http://www.cnblogs.com/aicro/archive/2010/01/15/1642659.html
set
1 #include<iostream> 2 #include<set> 3 #include<string> 4 using namespace std; 5 int main() 6 { 7 set<string> check; 8 string str; 9 string temp; 10 int i,j; 11 while(cin>>str && str != "*") 12 { 13 bool flag = false; 14 for(i = 1;i <= str.length() - 1; i++) 15 { 16 check.clear(); 17 for(j = 0;j <= str.length() -1 - i;j++) 18 { 19 temp = ""; 20 temp = str.substr(j,1) + str.substr(j + i,1);//string 的用法,分别从j开始截取1个字符 21 //和从j+i开始截取1个字符 并连接起来 22 if(check.count(temp) != 0) 23 { 24 flag = true; 25 break; 26 } 27 check.insert(temp); 28 } 29 if(flag == true) 30 break; 31 } 32 if(flag == false) 33 cout<<str<<" is surprising."<<endl; 34 else 35 cout<<str<<" is NOT surprising."<<endl; 36 } 37 }
vector
转自:http://blog.csdn.net/yzl_rex/article/details/7647532
1 //这题的测试数据很水,以为下面的做法会超时的!呵呵! 题意:在一个字符串中,给出一些字符间的距离,然后 2 //让你根据这距离再重新组成字符串,检查是否有相同的字符串存在! 3 #include <iostream> 4 #include <string> 5 #include <vector> 6 using namespace std; 7 8 vector<string> v; 9 10 int main() 11 { 12 string str, tmp; 13 int i, len, d, j, size, k, l; 14 bool flag1, flag2; 15 while (cin >> str) 16 { 17 if(str == "*") break; 18 len = str.length(); 19 flag2 = false; 20 if (len == 1) 21 cout << str << " is surprising." << endl; 22 else 23 { 24 d = len - 2;//字符的距离范围 25 for (i = 0; i <= d; i++)//对每一种的距离暴力 26 { 27 v.clear(); 28 flag1 = false; 29 for (j = 0; j < len; j++) 30 { 31 if (j+i+1 >= len) break; 32 else 33 { 34 tmp.clear(); 35 tmp.push_back(str[j]); 36 tmp.push_back(str[j+i+1]); 37 v.push_back(tmp); 38 } 39 } 40 size = v.size(); 41 //对结果进行判断,如果有相同的字符串,就立刻退出,不用再往下判断! 42 for (k = 0; k < size; k++) 43 for (l = k+1; l < size; l++) 44 { 45 if (v[k] == v[l]) 46 { 47 flag1 = true; 48 break; 49 } 50 } 51 if (flag1) 52 { 53 cout << str << " is NOT surprising." << endl; 54 flag2 = true; 55 break; 56 } 57 } 58 if (!flag2) 59 cout << str << " is surprising." << endl; 60 } 61 } 62 63 system("pause"); 64 }
vector知识:http://blog.163.com/lee_020/blog/static/12475560201242152530509/