1004

来源:互联网 发布:私募通数据库 编辑:程序博客网 时间:2024/06/16 02:05

这题有两种方法,第一种是用map标记一下。

第二种是用最小表示法,但是我用第二种方法却过不了,希望大神们来找找错。


第一种:

<pre name="code" class="cpp">#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <map>using namespace std;string ch;map<string,int>q;int main(){int N,len;cin.sync_with_stdio(false);cin>>N;q.clear();for(int i=1;i<=N;i++){cin>>ch;sort(ch.begin(),ch.end());//对每个串内部排下序 即string类型的排序 printf("%d\n",q[ch]);q[ch]++;}return 0;}



第二种:

#include <iostream>#include <cstdio>#include <cstring>#include <map>using namespace std;string a;map<string,int>flag;int main(){    int N;        int i,j,k,m,n,len,num;    string s;    scanf("%d",&N);        num=0;        flag.clear();        for(i=1;i<=N;i++)        {            s="";            cin>>a;            j=0;            k=1;            len=a.size();            while(k<len)            {                if(a[j]<a[k])                k++;                else if(a[j]>a[k])                {                    j=k;                    k=j+1;                }                else                 {                    int sum;                    m=j;                    n=k;                    for(sum=1;sum<len;sum++)                    {                    m%=len;                    n%=len;                    if(a[m]<a[n])                    {                        k++;                        break;                    }                    else if(a[m]>a[n])                    {                        j=k;                        k++;                        break;                    }                    m++;                    n++;                    }                    if(sum==len)                    {                        k++;                    }                }            }            int p;            for(p=1;p<=len;p++)            {                s=s+a.substr(j,1) ;                j++;                j%=len;            }                printf("%d\n",flag[s]);flag[s]++;        }return 0;}


0 0
原创粉丝点击