Cはスクエア教育Codeforcesラウンド42は、(暴力的な列挙、文字列マッチング)(本部2の定格)してください

C.スクエア作る
時間制限TEST2秒あたり
test256メガバイトあたりのメモリ制限
入力inputstandard
出力outputstandard
あなたが先行ゼロなしで書かれた正の整数n、(例えば、数04が間違っている)が与えられています。

結果は、先行ゼロなしの正の整数のままであるように一度の操作では、指定された整数のいずれかの数字を削除することができます。

あなたは一貫して、そこからいくつかの正の整数の二乗を作るか、それが不可能であることを報告するために与えられた整数nに適用する必要がある操作の最小数を決定します。

場合にのみ、X = Y2いくつかの正の整数yの場合は、整数xは、いくつかの正の整数の二乗です。

入力
最初の行は、単一の整数n(1≤n≤2⋅109)を含みます。数は、先行ゼロなしで与えられています。

出力
には、印刷、n個からいくつかの正の整数の二乗を作ることは不可能である場合は-1。他の場合には、それを行うために必要な操作の最小数を印刷します。


inputCopy
8314
outputCopy
2
inputCopy
625
outputCopy
0
inputCopy
333
outputCopy
-1

その8314は整数9の正方形である、81に等しくなった後、我々は8314から数字3と4を削除しなければならない最初の例では。

2番目の例で与えられた625は、整数25の正方形であるので、あなたは何を削除するべきではありません。

第三の例では、333から正方形を作ることは不可能であるので、答えは-1です。

質問の意味:
あなたの文字列を与えるので、あなたは、文字列の最小数を削除し、その文字列の残りの部分は、先行ゼロなしで数を表し、そして数の正方形であるために。
アイデア:
文字列の長さは2E9であるので、我々は、yの最大範囲SQRT(2E9)は、我々が文字列(9の最大長)に、すべてのy、彼の正方形の数を列挙することができることは明らかであり、かつに与えられたことを知っています文字列照合は、与えられた文字列かどうかを検出するのサブこと、及び最小配列が答えである満たすために文字の異なる数を維持することができます。

O(9 *のSQRT(2E9))の時間複雑

詳細コードを参照してください。

#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const ll inf=1e18+7;
/*** TEMPLATE CODE * * STARTS HERE ***/
string S(ll n){stringstream ss;string s;ss<<n;ss>>s;return s;}
ll N(string s){stringstream ss;ll n;ss<<s;ss>>n;return n;}
string a;
int main()
{
    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
 
    cin>>a;
    ll ans=inf;
    int len=a.length();
    ll y=1ll;
    while(1)
    {
        ll x=y*y;
        string str=S(x);
        int slen=str.size();
        if(slen>len)
            break;
        int id=0;
        for(int i=0;i<len;++i)
        {
            if(a[i]==str[id])
            {
                id++;
            }
        }
        if(id==slen)
        {
            ans=min(ans,1ll*len-slen);
        }
        y++;
    }
 
    if(ans==inf)
    {
        ans=-1;
    }
    cout<<ans<<endl;
 
    return 0;
}
 
inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
 
 
 

おすすめ

転載: www.cnblogs.com/qieqiemin/p/11272191.html