Submission details
Task:Period
Sender:sfjiang
Submission time:2020-09-26 15:03:27 +0300
Language:C++ (C++11)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.01 sdetails
#4ACCEPTED0.01 sdetails
#5ACCEPTED0.01 sdetails
#6ACCEPTED0.01 sdetails
#7ACCEPTED0.01 sdetails
#8ACCEPTED0.03 sdetails
#9ACCEPTED0.05 sdetails
#10ACCEPTED0.03 sdetails
#11ACCEPTED0.03 sdetails
#12ACCEPTED0.04 sdetails
#13ACCEPTED0.04 sdetails
#14ACCEPTED0.04 sdetails
#15ACCEPTED0.04 sdetails
#16ACCEPTED0.04 sdetails
#17ACCEPTED0.04 sdetails
#18ACCEPTED0.04 sdetails
#19ACCEPTED0.02 sdetails
#20ACCEPTED0.02 sdetails
#21ACCEPTED0.02 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:70:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%s", input);
     ~~~~~^~~~~~~~~~~~~

Code

#include <cstdio>
#include <cstring>
#include <algorithm>

const int maxn = 100010;

int A[maxn], B[maxn], C[maxn], D[maxn], *sa = D + 1, *rank, *height;
void sortAndRank(int *a1, int *a2, int n, int &m, int j) {
  int i;  memset(C, 0, sizeof(C));
  for(i = 0; i < n; i ++)    C[a1[i]] ++;
  for(i = 1; i <=m; i ++)    C[i] += C[i-1];
  for(i = n-1; i >= 0; i --)    sa[--C[a1[a2[i]]]] = a2[i];
  a2[sa[0]] = m = 0;
  for(i = 1; i < n; i ++)
a2[sa[i]] = a1[sa[i-1]]==a1[sa[i]] && a1[sa[i-1]+j]==a1[sa[i]+j] ? m : ++ m;
}
void da(char*str, int n, int m) {
  int *a1 = A, *a2 = B, *tmp;  int i, j, p;
  for(i = 0; i < n; i ++) {    a1[i] = i;    a2[i] = str[i];  }
  a1[n] = a2[n] = -1;
  sortAndRank(a2, a1, n, m, 0);
  for(j = 1; m < n-1; j <<= 1) {
    p = 0;
    for(i = n-j; i < n; i ++)  a2[p ++] = i;
    for(i= 0; i < n; i ++)    if(sa[i]>=j)  a2[p ++] = sa[i]-j;
    sortAndRank(a1, a2, n, m, j);
    tmp = a1;  a1 = a2;  a2 = tmp;
  }  rank = a1;  height = a2;
}
void calHeight(char *str, int n) {
  int i, j, k;
  sa[-1] = n;
  for(height[0] = k = i = 0; i < n; i ++) {
    for(k ? k-- : 0, j = sa[rank[i]-1]; str[i+k]==str[j+k]; k++);
    height[rank[i]] = k;
  }
}

int mm[maxn],*rmq;//让rmq=height
int best[20][maxn];
void Init(int n) {
  int i,j,a,b;
  rmq[0] = -999999999;//让rmq[0]取最反向值 
  mm[0]=-1; 
  for(i=1; i<=n; i++) {
    mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
    best[0][i]=i;
  }
  for(i=1; i<=mm[n]; i++) {
    for(j=1; j<=n+1-(1<<i); j++) {
      a=best[i-1][j];      b=best[i-1][j+(1<<(i-1))];
      best[i][j]=rmq[a] < rmq[b]?a:b;
    }  }}
int query(int a, int b) {
  if(a > b)  return 0;
  int t;
  t=mm[b-a+1];  a=best[t][a];  b=best[t][b-(1<<t)+1];
  return rmq[a] < rmq[b] ? a : b;
}
int getLCP(int p,int q) {
  if (p>q) return getLCP(q,p);
  return rmq[query(p + 1, q)];
}


char input[maxn];

int main()
{
    scanf("%s", input);
    int n = strlen(input);
    da(input, n, 300);
    calHeight(input, n);
    rmq = height;
    Init(n);
    for (int p = 1; p <= n; p++)
    {
      int found = 1;
      for (int j = p; j < n; j += p)
      {
        //printf("%d, %d, %d\n", rank[0], rank[j], getLCP(rank[0], rank[j]));
        if (getLCP(rank[0], rank[j]) < std::min(p, n - j))
        {
          found = 0;
          break;
        }
      }
      if (found)
      {
        input[p] = 0;
        printf("%s\n", input);
        break;
      }
    }
    return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
acbacbac

correct output
acb

user output
acb

Test 2

Verdict: ACCEPTED

input
a

correct output
a

user output
a

Test 3

Verdict: ACCEPTED

input
z

correct output
z

user output
z

Test 4

Verdict: ACCEPTED

input
aa

correct output
a

user output
a

Test 5

Verdict: ACCEPTED

input
az

correct output
az

user output
az

Test 6

Verdict: ACCEPTED

input
aba

correct output
ab

user output
ab

Test 7

Verdict: ACCEPTED

input
abab

correct output
ab

user output
ab

Test 8

Verdict: ACCEPTED

input
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
a

user output
a

Test 9

Verdict: ACCEPTED

input
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

correct output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

user output
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
Truncated

Test 10

Verdict: ACCEPTED

input
ababababababababababababababab...

correct output
ab

user output
ab

Test 11

Verdict: ACCEPTED

input
tgainzxtgainzxtgainzxtgainzxtg...

correct output
tgainzx

user output
tgainzx

Test 12

Verdict: ACCEPTED

input
qmuflfcbqweunsjsodgspftyvikiwk...

correct output
qmuflfcbqweunsjsodgspftyvikiwk...

user output
qmuflfcbqweunsjsodgspftyvikiwk...

Test 13

Verdict: ACCEPTED

input
ohbsbconrkytyhtmibzrwwqdsqojoe...

correct output
ohbsbconrkytyhtmibzrwwqdsqojoe...

user output
ohbsbconrkytyhtmibzrwwqdsqojoe...
Truncated

Test 14

Verdict: ACCEPTED

input
hxkuxccasglgpvnfnhdoqelpvxughq...

correct output
hxkuxccasglgpvnfnhdoqelpvxughq...

user output
hxkuxccasglgpvnfnhdoqelpvxughq...
Truncated

Test 15

Verdict: ACCEPTED

input
mhwvddomkxrzuziwbfoaqxzjmfevla...

correct output
mhwvddomkxrzuziwbfoaqxzjmfevla...

user output
mhwvddomkxrzuziwbfoaqxzjmfevla...
Truncated

Test 16

Verdict: ACCEPTED

input
gnruvsfdjemxstfuysiqkrtwbgtono...

correct output
gnruvsfdjemxstfuysiqkrtwbgtono...

user output
gnruvsfdjemxstfuysiqkrtwbgtono...
Truncated

Test 17

Verdict: ACCEPTED

input
xqiwjzftugyurtwsziffnqaeozescu...

correct output
xqiwjzftugyurtwsziffnqaeozescu...

user output
xqiwjzftugyurtwsziffnqaeozescu...
Truncated

Test 18

Verdict: ACCEPTED

input
vgygtamnegxyxvjbuceoliipbkggyw...

correct output
vgygtamnegxyxvjbuceoliipbkggyw...

user output
vgygtamnegxyxvjbuceoliipbkggyw...
Truncated

Test 19

Verdict: ACCEPTED

input
qvjhmaafzlugwwaygdojysrjoydnnj...

correct output
qvjhmaafzlugwwaygdojysrjoydnnj...

user output
qvjhmaafzlugwwaygdojysrjoydnnj...
Truncated

Test 20

Verdict: ACCEPTED

input
tusmizkjfdazyohorfcumwmalodvnc...

correct output
tusmizkjfdazyohorfcumwmalodvnc...

user output
tusmizkjfdazyohorfcumwmalodvnc...
Truncated

Test 21

Verdict: ACCEPTED

input
zqikxaoeizncpvlpcvomrdkstackqq...

correct output
zqikxaoeizncpvlpcvomrdkstackqq...

user output
zqikxaoeizncpvlpcvomrdkstackqq...
Truncated