zoukankan      html  css  js  c++  java
  • hdu2609(最小表示法)

    题意:有n个环形字符串,一个环形字符串移动会形成不能的字符串,我们把它们看作同一串字符串,求有多少个不同的字符串.......

    思路:用最小表示发将一个环形串的最小字典序找出来,然后让这个环形串按照这个顺序来组成一个新的串,其他串都这样处理,然后去重,输出结果就是了.......

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char s[10005][105];
    struct node
    {
    	char ch[105];
    }t[10005];
    int cmp(const node a,const node b)
    {
    	if(strcmp(a.ch,b.ch)<0)
    	return 1;
    	else
    	return 0;
    }
    int work(int m,char str[]) 
    { 
        int i,j,l; 
        i=0; j=1; 
        while(i<m && j<m) 
        { 
            for(l=0;l<m;l++)  
                if(str[(i+l)%m]!=str[(j+l)%m]) break; 
            if(l>m) break; 
            if(str[(i+l)%m] > str[(j+l)%m]) 
                i=i+l+1; 
            else
                j=j+l+1; 
            if(i==j) j=i+1; 
        } 
        if(i<j) return i; 
        return j; 
    } 
    int main()
    {
    	int n;
    	while(scanf("%d",&n)>0)
    	{
    		for(int i=1;i<=n;i++)
    		scanf("%s",s[i]);
    		for(int i=1;i<=n;i++)
    		{
    			int len=strlen(s[i]);
    			int cnt=work(len,s[i]);
    			strcpy(t[i].ch,s[i]+cnt);
    			s[i][cnt]='';
    			strcpy(t[i].ch+len-cnt,s[i]);
    		}
    		sort(t+1,t+1+n,cmp);
    		int sum=1;
    		for(int i=2;i<=n;i++)
    		{
    			if(strcmp(t[i-1].ch,t[i].ch)!=0)
    			sum++;
    		}
    		printf("%d
    ",sum);
    	}
    	return 0;
    }
    
  • 相关阅读:
    C#之设计模式
    C#之索引器
    C#基础强化-继承与多态
    C#基础强化-进程操作
    WKWebView与JavaScript交互基础
    HTML之JS学习
    HTML之CSS学习
    HTML学习
    玩诈欺的小杉
    最大异或和
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3245348.html
Copyright © 2011-2022 走看看