HDU 2609 How Many
2016-03-15 20:49
323 查看
题目链接:HDU2609
题意:给你一堆串,如果一个串通过平移可以变成另一个串,就算两个串相同。我们要求出这堆串中有多少个不同的串。
题目分析:又是一道最大最小表示法的模板题,都转换成最小表示法,然后统计不同的串即可。
特别注意,转换后需要进行一次排序,不然会超时。
题意:给你一堆串,如果一个串通过平移可以变成另一个串,就算两个串相同。我们要求出这堆串中有多少个不同的串。
题目分析:又是一道最大最小表示法的模板题,都转换成最小表示法,然后统计不同的串即可。
特别注意,转换后需要进行一次排序,不然会超时。
#include<cstdio> #include<cstring> #include<algorithm> #include <iostream> using namespace std; struct node { char e[105]; int len; }p[10003]; int l[10003]; char str[105]; bool cmp(node a,node b) { return strcmp(a.e,b.e)<1; } int getmin(char *t,int len) { int i=0,j=1,k=0; while(i<len&&j<len&&k<len) { int buf=t[(i+k)%len]-t[(j+k)%len]; if(buf==0) k++; else { if(buf>0)i=i+k+1; else j=j+k+1; if(i==j) j++; k=0; } } return i; } int main() { int n; while(cin>>n) { for(int i=0;i<n;i++) { scanf("%s",str); l[i]=strlen(str); p[i].len=l[i]; int minpos=getmin(str,l[i]); for(int j=0,k=minpos;j<l[i];j++) p[i].e[j]=str[(k++)%l[i]]; p[i].e[l[i]]='\0'; } int sum=1; sort(p,p+n,cmp); for(int i=1;i<n;i++) if(strcmp(p[i-1].e,p[i].e)!=0||p[i-1].len!=p[i].len) sum++; cout<<sum<<endl; } }
相关文章推荐
- 如何使用ZEROBRANE STUDIO远程调试COCOS2D-X的LUA脚本(转)
- Linux系统编程--fork和vfork
- JS对象继承方法
- dede过滤内容html样式的函数
- 八大排序
- java学习笔记知识点整理02
- 一次让人难以忘怀的排查频繁Full GC过程
- 2659: [Beijing wc2012]算不出的算式 打表+找规律
- 约瑟夫环问题(循环链表)
- HTTP、TCP、UDP、Socket
- 在QT下的基于UDP协议的消息收发程序
- 关于开机启动的不需要的服务
- c++ new 重载
- html5 IndexedDB
- javascript中为什么有时需要创建立即执行的函数
- 开发常用工具类-持续更新中
- 选择器
- String Matching Content Length
- border占据边距的问题
- zb的生日