周源课件下载地址:http://download.csdn.net/download/xsbailong/3662154
zoj 200 ac达成~
虽然还是很菜,不过最起码已经进步了~所以,xsbailong,继续加油~
/*
zoj_1729 字符串处理
zoj200ac达成,纪念一下,xsbailong,继续加u~
字符串最小表示的题目,以前木有做过。。特地去找周源的课件看了下。
我写的三个版本:
TLE算法1:当时觉得string erase要模拟很简单,直接枚举。。。果断TLE
TLE算法2:这次我是换成搜索,搜索当前字符串最小的字母,如果当前最小字母不止一个,去除非最小字母,
更新当前最小字母为它在原字符串中的下一个字母,一直这样下去直到剩下的方法只有一个或者
全部试完。依旧TLE。其实这种方法有个明显不足。。假设有10000个a。。。。
最小表示法:具体解释起来多点,看周源的课件就很明了啦~
收获:最小表示法的学习
*/
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
int T,i,j,k,n,len;
string s;
cin>>T;
while( T-- )
{
cin>>n>>s;
len=s.size();
s+=s;
i=0,j=1,k=0;
while( i<len && j<len && k<len )
{
if( s[i+k]==s[j+k] )
{
k++;
}
else if( s[i+k]>s[j+k] )
{
i=i+k+1;
j=i+1;
k=0;
}
else
{
j++;
k=0;
}
}
cout<<i<<endl;
}
return 0;
}
//TLE算法2
/*
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
struct password
{
char key;
int id;
int pos;
};
vector <password>v;
int n;
string t;
bool cmp( password a,password b )
{
if( a.key!=b.key )
return a.key<b.key;
else return a.id<b.id;
}
void choose(int m,int step)
{
int i;
//cout<<m<<endl<<endl;
if( m==1 || step>=n ) return;
for( i=0;i<m;i++ )
{
v[i].pos=( v[i].pos+1 )%n;
v[i].key=t[ v[i].pos ];
}
sort( v.begin(),v.begin()+m,cmp );
i=1;
while( v[i].key==v[i-1].key && i<m )
i++;
choose( i,step+1 );
}
int main()
{
int T,i;
char mini;
password p;
cin>>T;
while( T-- )
{
cin>>n>>t;
mini='z';
for( i=0;i<n;i++ )
if( t[i]<mini )
mini=t[i];
for( i=0;i<n;i++ )
{
if( t[i]==mini )
{
p.id=i;
p.pos=i;
p.key=t[i];
v.push_back(p);
}
}
choose( v.size(),0 );
cout<<v[0].id<<endl;
v.clear();
}
return 0;
}
*/
//TLE算法1,滚动数组+string erase+枚举
/*
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
struct password
{
string s;
int id;
}p[3];
int main()
{
int T,n,i;
string s;
char t;
cin>>T;
while( T-- )
{
cin>>n>>p[0].s;
p[0].id=0;
p[1].s=p[0].s;
p[1].id=p[0].id;
i=1;
while( i<n )
{
p[2].s=p[1].s;
p[2].id=i;
t=p[2].s[0];
p[2].s.erase( 0,1 );
p[2].s+=t;
if( p[2].s<p[0].s )
{
p[0].s=p[2].s;
p[0].id=p[2].id;
}
p[1].s=p[2].s;
p[1].id=p[2].id;
i++;
}
cout<<p[0].id<<endl;
}
return 0;
}*/