hdu 3374 String Problem 

最小表示法

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <string>
using namespace std;
const int N = 10010;
int n;
char s[105];
map<string, int >ma;

void getminsub(char *s)
{
    int i=0, j=1, len=strlen(s), k=0;
    while(i<len && j<len && k<len)
    {
        if(i==j) j++;
        int ni=(i+k)%len, nj=(j+k)%len;
        if(s[ni]>s[nj]) i += k+1, k=0;
        else if(s[ni]<s[nj]) j+=k+1, k=0;
        else k++;
    }
    char tmp[105];
    strcpy(tmp, s+i);
    s[i] = '\0';
    strcpy(tmp+len-i, s);
    strcpy(s, tmp);
}

int main()
{
    while(scanf("%d", &n)>0)
    {
        ma.clear();
        int ans = 0;
        for(int i=1; i<=n; i++)
        {
            scanf("%s", s);
            getminsub(s);
            if(!ma[s])
            {
                ans++;
                ma[s] = i;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

相关文章: