hdu2609 How many (最小表示法)


http://acm.hdu.edu.cn/showproblem.php?pid=2609

 

題意:

給出n個字符串,如果字符串A循環同構可變成B,則A與B是相同的,問有多少個不同的字符串。

 

用最小表示法表示出每個字符串,然后map判重即可

最小表示法轉向https://www.cnblogs.com/TheRoadToTheGold/p/7040955.html

 

#include<map>
#include<cstdio>
#include<cstring> 
#include<iostream>
#include<algorithm>

using namespace std;

#define N 10001

string a[N];
char s[1000001];
int len;
map<string,int>mp;

int getmin()
{
    len=strlen(s); 
    int i=0,j=1,k;
    while(i<len && j<len)
    {
        k=0;
        while(k<len && s[(i+k)%len]==s[(j+k)%len]) k++;
        if(k==len) break;
        if(s[(i+k)%len]<s[(j+k)%len]) j=max(i+1,j+k+1);
        else i=max(j+1,i+k+1);
    }
    return min(i,j);
}

int main()
{
    int n,ans;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;++i) a[i].clear();
        mp.clear();
        ans=0;
        for(int i=1;i<=n;++i) 
        {
            scanf("%s",s);
            int st=getmin();
            for(int j=st;j<len;++j) a[i]+=s[j];
            for(int j=0;j<st;++j) a[i]+=s[j];
            mp[a[i]]++;
            if(mp[a[i]]==1) ans++;
        }
        printf("%d\n",ans); 
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM