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;
}