zoukankan      html  css  js  c++  java
  • POJ3096Surprising Strings(map)

    题意:输入很多字符串,以星号结束。判断每个字符串是不是“Surprising Strings”,判断方法是:以“ZGBG”为例,“0-pairs”是ZG,GB,BG,这三个子串不相同,所以是“0-unique”,“1-pairs”是ZB,GG,这两个也是不同的,所以是“1-unique”,“2-pairs”是ZG,所以是“2-unique”;综合起来是“Surprising Strings”。

    思路:用map就可以,做的时候手欠用了暴搜,结果发现竟然0ms过了,不科学。而用map花了16ms非常的不科学。用暴搜的话就是for循环枚举即可,用一个数组标记一下两个字符的和,就行。

    map的代码:

    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<string>
    using namespace std;
    char s[110];
    int main()
    {
        while(scanf("%s",s))
        {
            if(!strcmp(s,"*"))
                break;
            int k=strlen(s);
            bool flag=true;
            for(int i=0; i<=k-2; i++)
            {
                map<string,int>q;
                for(int j=0; j+i<k; j++)
                {
                    char s1[3];
                    s1[0]=s[j];
                    s1[1]=s[j+i+1];
                    s1[2]='';
                    if(q.find(s1)==q.end())//进行查找操作
                        q[s1]=1;//没有就标记为1
                    else
                    {
                        flag=false;
                        break;
                    }
                }
                if(!flag) break;
            }
            if(flag)
                printf("%s is surprising.
    ",s);
            else printf("%s is NOT surprising.
    ",s);
        }
        return 0;
    }
    View Code

    枚举的代码:

    #include<stdio.h>
    #include<map>
    #include<cstring>
    #include<string>
    #include<iostream>
    using namespace std ;
    int main()
    {
        string str ;
        while(cin>>str)
        {
            if(str=="*")
                break ;
            bool mark = 0;
            bool flag[80000];
            for(int i = 0 ; i<=(int)str.length()-2 ; i++)//强制转换为int类型是因为str.length()是无符号的,如果为1的时候减去2以上的就容易溢出
            {
                 memset(flag,false,sizeof(flag)) ;
                for(int j = 0 ; j+i<(int)str.length()-1 ; j++)
                {
                    int s = (str[j]-'A')+1000*(str[j+i+1]-'A');//防止出现BG和GB这样加起来就成一样的了
                    if(flag[s] == false)
                        flag[s] = true ;
                    else
                    {
                        mark = true ;
                        break ;
                    }
                }
                if(mark)
                    break ;
            }
            if(mark)
                cout<<str<<" is NOT surprising."<<endl;
            else
                cout<<str<<" is surprising."<<endl;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    选择排序
    冒泡排序
    java多线程
    Java中的内存泄露的几种可能
    "==" 与 “equals”
    保证service不被杀死的方法
    反射、注解、依赖
    引导页
    适配:px与dp转换
    四 主要的几种 Web 服务器
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3395059.html
Copyright © 2011-2022 走看看