POJ 3007 Organize Your Train part II map与字典树的比较
来源:互联网 发布:手机声音放大器软件 编辑:程序博客网 时间:2024/05/16 08:50
点击打开链接
给定一个字符串,从任意位置把它切为两半,得到两条子串
定义 子串1为s1,子串2为s2,子串1的反串为s3,子串2的反串为s4
现在从s1 s2 s3 s4中任意取出两个串组合,问有多少种不同的组合方法
规定:
(1) 串Si不能和其 反串 组合
(2) Si+Sj 与 Sj+Si 是两种组合方式(但未必是不同的组合方式)
///字典树 时间283MS#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<set>#include<map>#define PI acos(-1)#define eps 0.00000001#define LL long longusing namespace std;struct node{ int flag; int next[26];}p[610000];int top;int Creat(){ memset(p[top].next,-1,sizeof(p[top].next)); p[top].flag=0; return top++;}int Build(char s[]){ int k=0; int len=strlen(s); for(int i=0;i<len;i++) { int ch = s[i]-'a'; if(p[k].next[ch]==-1) p[k].next[ch]=Creat(); k=p[k].next[ch]; } p[k].flag=1;}int Find(char s[]){ int k=0; int len=strlen(s); for(int i=0;i<len;i++) { int ch = s[i]-'a'; if(p[k].next[ch]==-1) return 0; k=p[k].next[ch]; } return p[k].flag;}int main(){ string c; char s[100],s1[100],s2[100],s3[100],s4[100],s5[100],s6[100],s7[100]; int n; while(~scanf("%d",&n)) { while(n--) { top=0; scanf("%s",s); int len=strlen(s); int geshu=0; /// map<string,bool>Q; geshu++; ///Q[s]=1; int k=Creat(); Build(s); for(int i=1; i<len; i++) { int num=0,num1=0; for(int j=0; j<i; j++) { s1[num]=s[j]; ///12 s2[num]=s[i-j-1]; /// 21 s3[num++]=s[i-j-1]; /// 21 } for(int j=i; j<len; j++) { s1[num]=s[len-1-j+i]; ///12 43 s3[num]=s[len-1-j+i]; ///21 43 s2[num++]=s[j]; /// 21 34 s4[num1]=s[j]; ///34 s5[num1]=s[j]; ///34 s6[num1]=s[len-1-j+i]; /// 43 s7[num1++]=s[len-1-j+i]; /// 43 } for(int j=0; j<i; j++) { s4[num1]=s[j]; ///34 12 s5[num1]=s[i-j-1]; /// 34 21 s6[num1]=s[j]; /// 43 12 s7[num1++]=s[i-j-1]; /// 43 21 } s7[num]=s6[num]=s5[num]=s4[num]=s1[num]=s2[num]=s3[num]='\0'; /// c=s1; ///不将char[]转变成string 然后再map[] 就会超时 if(!Find(s1)) { // cout<<"s1"<<s1<<endl; geshu++; Build(s1); } if(!Find(s2)) { //cout<<"s2"<<s2<<endl; geshu++; Build(s2); } if(!Find(s3)) { //cout<<"s3"<<s3<<endl; geshu++; Build(s3); } if(!Find(s4)) { //cout<<"s4"<<s4<<endl; geshu++; Build(s4); } if(!Find(s5)) { //cout<<"s5"<<s5<<endl; geshu++; Build(s5); } if(!Find(s6)) { //cout<<"s6"<<s6<<endl; geshu++; Build(s6); } if(!Find(s7)) { //cout<<"s7"<<s7<<endl; geshu++; Build(s7); } } printf("%d\n",geshu); } } return 0;}
///map 容器 938MS ///必须 先将char[]转化为string类型 然后再map 否则会超时#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<cmath>#include<algorithm>#include<queue>#include<set>#include<map>#define PI acos(-1)#define eps 0.00000001#define LL long longusing namespace std;int main(){ string c; char s[100],s1[100],s2[100],s3[100],s4[100],s5[100],s6[100],s7[100]; int n; while(~scanf("%d",&n)) { while(n--) { scanf("%s",s); int len=strlen(s); int geshu=0; map<string,bool>Q; geshu++; Q[s]=1; for(int i=1; i<len; i++) { int num=0,num1=0; for(int j=0; j<i; j++) { s1[num]=s[j]; ///12 s2[num]=s[i-j-1]; /// 21 s3[num++]=s[i-j-1]; /// 21 } for(int j=i; j<len; j++) { s1[num]=s[len-1-j+i]; ///12 43 s3[num]=s[len-1-j+i]; ///21 43 s2[num++]=s[j]; /// 21 34 s4[num1]=s[j]; ///34 s5[num1]=s[j]; ///34 s6[num1]=s[len-1-j+i]; /// 43 s7[num1++]=s[len-1-j+i]; /// 43 } for(int j=0; j<i; j++) { s4[num1]=s[j]; ///34 12 s5[num1]=s[i-j-1]; /// 34 21 s6[num1]=s[j]; /// 43 12 s7[num1++]=s[i-j-1]; /// 43 21 } s7[num]=s6[num]=s5[num]=s4[num]=s1[num]=s2[num]=s3[num]='\0'; c=s1; ///必须 先将char[]转化为string类型 然后再map 否则会超时 if(!Q[c]) { // cout<<"s1"<<s1<<endl; geshu++; Q[c]=true; } c=s2; if(!Q[c]) { //cout<<"s2"<<s2<<endl; geshu++; Q[c]=true; } c=s3; if(!Q[c]) { //cout<<"s3"<<s3<<endl; geshu++; Q[c]=true; } c=s4; if(!Q[c]) { //cout<<"s4"<<s4<<endl; geshu++; Q[c]=true; } c=s5; if(!Q[c]) { //cout<<"s5"<<s5<<endl; geshu++; Q[c]=true; } c=s6; if(!Q[c]) { //cout<<"s6"<<s6<<endl; geshu++; Q[c]=true; } c=s7; if(!Q[c]) { //cout<<"s7"<<s7<<endl; geshu++; Q[c]=true; } } printf("%d\n",geshu); } } return 0;}
0 0
- POJ 3007 Organize Your Train part II map与字典树的比较
- POJ 3007 Organize Your Train part II map+string
- poj 3007 Organize Your Train part II(map)
- POJ 3007 Organize Your Train part II
- POJ 3007 Organize Your Train part II
- POJ 3007 Organize Your Train part II
- POJ 3007:Organize Your Train part II
- poj-3007 Organize Your Train part II
- poj 3007 Organize Your Train part II
- POJ 3007 - Organize Your Train part II
- poj 3007Organize Your Train part II
- POJ Organize Your Train part II 3007
- poj-3007-Organize Your Train part II
- Organize Your Train part II【POJ--3007】【平衡二叉树】
- poj3007 Organize Your Train part II(字典树)
- POJ 3007.Organize Your Train part II
- POJ 3007 Organize Your Train part II(枚举)
- 【POJ 3007】 Organize Your Train part II (字符串HASH)
- 计算机网络----- TCP协议
- ProjectOne(07) - 番外篇04 注册一个Github账号,并提交代码
- win10/8 中文版快速升级专业版
- libjpeg库的编译和应用
- POSIX信号量与互斥锁
- POJ 3007 Organize Your Train part II map与字典树的比较
- 缺省构造函数
- 如何下载离线版Chrome安装文件
- Servlet生命周期与工作原理
- requirejs
- 买水果(组合)
- Problem D、F: C语言习题 矩阵元素变换
- 遍历Map的四种方法
- linux程序设计(套接字)+TCP/IP网络编程学习笔记