POJ 3007.Organize Your Train part II题解--zhengjun

思路

首先一看就是统计有多少不同的字符串。

那么肯定就是用字典树了。

然后如果当前字符串与之前的某个字符串是一样的,那么一定会有使得每一次向下一个节点时,这个节点都是存在的。

最后记得清空。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<set>
using namespace std;typedef long long ll;
struct Precision{int x;Precision(int a){x=a;}};struct Setw{int x;Setw(int a){x=a;}};struct Setfill{int x;Setfill(int a){x=a;}};
#define Set(x,y,z) Setw(x)<<Setfill(y)<<z<<Setw(0)
struct IO{
	#define Tp template<typename T>
	#define _D isdigit(c=gc())
	#define _A f|=eofbit;if(f)_R;
	#define _R return *this
	#define _G p1==p2&&(p2=(p1=buf)+fread(buf,1,S,stdin),p1==p2)?EOF:*p1
	#define _T(x) while(st[++st[0]]=x%10+'0',x/=10)
	#define _O operator
	static const int S=1<<21;char buf[S],*p1,*p2,sf;int st[105],Top,bs,sw;bool eofbit,f;void clear(){fwrite(buf,1,Top,stdout);Top=0;}
	IO& _O >> (char&c){_A;while(T(c=gc())){_A;}_R;}int P(char c){return c=='\n'||(c=='\r'&&(nex()=='\n'&&(gc(),1)))||(c==EOF&&(eofbit=1));}
	IO& _O >> (string&str){_A;str="";char c;while(T(c=gc())){_A;}while(str+=c,!T(c=gc()));_R;}void put(int x){while(x-->0)pc(sf);}
	IO& _O >> (char*c){_A;while(T(*c=gc())){_A;}while(!T(*++c=gc()));*c=0;_R;}IO& _O << (const char c){pc(c);_R;}
	IO& _O >> (double&x){_A;x=0;bool F=0;char c;while(!_D){F^=(c=='-');_A;}while(x=x*10+(c^48),_D);if(c!='.')_R;c=gc();double k=1;
		while(x+=(c^48)*(k*=0.1),_D);F&&(x=-x);_R;}void pc(const char c){Top==S&&(clear(),0);buf[Top++]=c;}char gc(){return _G++;}
	Tp IO& _O >> (T&x){_A;x=0;bool F=0;char c;while(!_D){F^=(c=='-');_A;}while(x=(x<<3)+(x<<1)+(c^48),_D);F&&(x=-x);_R;}
	IO& _O << (const string &str){int len=str.length();put(sw-len);for(int i=0;i<len;i++)pc(str[i]);_R;}_O bool()const{return !f;}
	IO& _O << (char*c){int len=strlen(c);put(sw-len);for(int i=0;i<len;i++)pc(c[i]);_R;}IO& _O << (Setfill x){sf=x.x;_R;}
	IO& _O << (const char*c){int len=strlen(c);put(sw-len);for(int i=0;i<len;i++)pc(c[i]);_R;}IO(){bs=6;eofbit=0;sw=0;sf=' ';}
	IO& _O << (double x){x<0&&(st[++st[0]]='-',x=-x);double t=0.5;for(int i=1;i<=bs;i++)t*=0.1;x+=t;ll y=x;_T(y);put(sw-st[0]-bool(bs)-bs);
		while(st[0])pc(st[st[0]--]);x-=ll(x);if(bs)pc('.');for(int i=1;i<=bs;i++)pc(int(x*=10)+'0'),x-=int(x);_R;}char nex(){return _G;}
	Tp IO& _O << (T x){x<0&&(pc('-'),x=-x);_T(x);put(max(sw-st[0],0));while(st[0])pc(st[st[0]--]);_R;}IO& _O << (Precision x){bs=x.x;_R;}
	IO& getline(string&str){_A;str="";char c=gc();if(!P(c))while(str+=c,!P(c=gc()));_R;}IO& _O << (Setw x){sw=x.x;_R;}
	IO& getline(char*c){_A;*c=gc();if(!P(*c))while(!P(*++c=gc()));*c=0;_R;}int T(char c){return c==' '||P(c);}~IO(){clear();}
}fin,fout;
const int N=1e6+10;
int T,n,ans;string str;int nex[71*8*71+1][26],cnt;
void add(string str){
	int len=str.length(),now=0;
	for(int i=0;i<len;i++){
		if(!nex[now][str[i]-'a']){
			ans++;
			for(int j=i;j<len;j++){
				nex[now][str[j]-'a']=++cnt;
				now=cnt;
			}
			break;
		}
		else now=nex[now][str[i]-'a'];
	}
}
void reverse(string &str){for(int i=0,j=str.length()-1;i<j;i++,j--)swap(str[i],str[j]);}
int main(){
	freopen("1.in","r",stdin);
	for(fin>>T;T--;){
		fin>>str;n=str.length();
		for(int i=1;i<n;i++){
			string a=str.substr(0,i),b=str.substr(i);
			add(a+b);add(b+a);
			reverse(a);
			add(a+b);add(b+a);
			reverse(b);
			add(a+b);add(b+a);
			reverse(a);
			add(a+b);add(b+a);
		}
		fout<<ans<<'\n';ans=0;for(int i=0;i<=cnt;i++)memset(nex[i],0,sizeof(nex[i]));cnt=0;
	}
	return 0;
}
posted @ 2022-06-11 15:31  A_zjzj  阅读(19)  评论(0编辑  收藏  举报