HDU - 2609 - How many
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 2609 - How many相关的知识,希望对你有一定的参考价值。
题目链接:HDU - 3374
题目大意:
给出n个串,每个串可以进行变形,如0110 -> 1100 -> 1001 -> 0011->0110.
变形前后是等效的,问这种情况下有多少种不同的串。
题目分析:
利用最小表示法将字符变为最小表示,存入set里面,最后的set里面的个数
就是不同的字符串。
最小表示法的讲解:
http://www.cnblogs.com/XGHeaven/p/4009210.html
听说和后缀自动机有关(逃
给出代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <string> 5 #include <vector> 6 #include <string> 7 #include <set> 8 #include <cstring> 9 using namespace std; 10 int get_s(string s) 11 { 12 int i=0; 13 int j=1; 14 int k=0; 15 int n=s.length(); 16 while(i<n&&j<n&&k<n) 17 { 18 int t=s[(i+k)%n]-s[(j+k)%n]; 19 if(!t) 20 k++; 21 else 22 { 23 if(t>0) 24 i+=k+1; 25 else 26 j+=k+1; 27 if(i==j) 28 j++; 29 k=0; 30 } 31 } 32 return i<j?i:j; 33 } 34 set<string> s; 35 int main() 36 { 37 int t; 38 while(cin>>t) 39 { 40 s.clear(); 41 for(int i=0;i<t;i++) 42 { 43 string a; 44 cin>>a; 45 int h=get_s(a); 46 string ss=""; 47 int cnt=0; 48 int n=a.length(); 49 for(int j=h;cnt<n;j++) 50 { 51 cnt++; 52 ss+=a[j%n]; 53 } 54 s.insert(ss); 55 // cout<<ss<<endl; 56 } 57 cout<<s.size()<<endl; 58 } 59 return 0; 60 }
以上是关于HDU - 2609 - How many的主要内容,如果未能解决你的问题,请参考以下文章