HDU

来源:互联网 发布:睡眠水 知乎 编辑:程序博客网 时间:2024/06/05 14:47

题目链接:HDU - 2609

大致题意:

这题就是给你n个字符串,然后如果是同构的字符串(如 :1100和0110和0011就是同样的字符串)

所以这题的话,就是用最小表示法求出所有字符串的最小表示法,再暴力一下,求出不同的最小表示法的个数。

#include<bits/stdc++.h>using namespace std;const int MAX_N =1e4+9;string vec[MAX_N];int res[MAX_N];string cmp[MAX_N];vector<string> que;int getMin(string str){    int len = str.length();    int i=0,j=1;    int k=0;    while(i<len && j<len)    {        int t = str[(i+k)%len] - str[(j+k)%len];        if(!t) k++;        else        {            if(t < 0)            {                if(j+k+1 > i) j = j+k+1;                else j = i+1;            }            else if(i+k+1 > j) i = i+k+1;            else i = j+1;            k=0;        }        if(k>=len) break;    }    return i>j?j:i;}int main(){    //freopen("in.txt","r",stdin);    int N,M,T;    while(cin>>N)    {        que.clear();        int num = 0;        for(int i =0;i<N;i++) cin>>vec[i];        for(int i =0;i<N;i++) res[i] = getMin(vec[i]);        for(int i =0;i<N;i++)        {            cmp[i] = vec[i].substr(res[i],vec[i].length()-res[i]) + vec[i].substr(0,res[i]);        }        for(int i=0;i<N;i++)        {            int flag = false;            for(int j =0 ;j<num;j++)            {                if(cmp[i] == que[j]) flag = true;            }            if(!flag)            {                num ++ ;                que.push_back(cmp[i]);            }        }        cout<<num<<endl;    }    return 0;}
原创粉丝点击