标签:des style blog http io ar color os sp
Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 130107/65536 K (Java/Others)
Total Submission(s): 466 Accepted Submission(s): 153
因为只有8个字母 。
那么先枚举长度 ( i = 1 ~ 8 )。
O(n)处理出该长度下主串存在的子串。
再枚举排列 ( j = 0 ~ i ! )判存。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <vector> #include <queue> #include <map> #include <set> #include <stack> #include <algorithm> using namespace std; typedef long long LL; typedef pair<int,int> pii; const int N = 1000010; const int M = 43046721; const int inf = 1e9+7; const double eps = 1e-8; bool vis[M]; char str[N]; int a[N],f[N],len; void get_s( int n , int cnt ,char *s) { for( int i = cnt-1 ; i >= 0 ; --i ){ s[i] = (n%8)+‘A‘; n/=8; } s[cnt] = 0 ; } int check( int n ) { int tmp = 0 ; if( len < n ) return -1; for( int i = 0 ; i < f[n] ; ++i ) vis[i] = false ; for( int i = 0 ; i < n ; ++i ) tmp = tmp * 8 + a[i] ; vis[tmp] = true ; for( int i = n ; i < len ; ++i ){ tmp = ( tmp % f[n-1] ) * 8 + a[i] ; vis[tmp] = true ; } for( int i = 0 ; i < f[n] ; ++i )if(!vis[i]){ return i ; } return -1 ; } void Run(){ scanf("%s",str); len = strlen(str); for( int i = 0 ; i < len ; ++i ) a[i] = str[i]-‘A‘; for( int i = 1 ; i <= 8 ; ++i ){ int res = check(i) ; if( res == -1 ) continue ; get_s(res,i,str) ; puts(str); return ; } } int main(){ #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int tot = 1 , m = 1 ; f[0] = 1 ; for( int i = 0 ; i < 8 ; ++i ) m *=8 ,f[tot++] = m ; int _ ; scanf("%d",&_); while( _-- ) Run(); }
HDU 4886 TIANKENG’s restaurant(Ⅱ) ( 暴力+hash )
标签:des style blog http io ar color os sp
原文地址:http://www.cnblogs.com/hlmark/p/4152818.html