/*
Problem link
Type: string process, kmp, adhoc
Algorithm:
- For each prefix of the input of length i:
  + Use KMP or naive string matching to find all occurrences.
  + Check if the occurrences are periodic.
- In this problem I use KMP for string matching.
- The function kmpProcess() build the "reset table" b for string "s".
- The function kmpSearch() find all occurrences of "pattern" in input string "s".
- The solve() function generates all prefix of length "i" from 1 to n. 
  Run kmpSearch() on each prefix and check if it is a period of input string.
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 100;
string s;
int b[maxn];
int res[maxn];
void kmpProcess(string s, int b[]) {
 int i = 0, j = -1;
 b[0] = j;
 int m = s.length();
 while (i < m) {
  while (j >= 0 && s[i] != s[j]) j = b[j];
  i++; j++;
  b[i] = j;
 }
}
void kmpSearch(string s, string pattern, int b[], int res[], int& cnt) {
 int i = 0, j = 0;
 cnt = 0;
 int n = s.length();
 int m = pattern.length();
 while (i < n) {
  while (j >= 0 && s[i] != pattern[j]) j = b[j];
  i++; j++;
  if (j == m) {
   res[cnt++] = i - j;
   j = b[j];
  }
 }
}
int solve() {
 string p;
 int n = s.length();
 int cnt;
 for (int i = 0; i < n; i++) {
  p = p + s[i];
  kmpProcess(p,b);
  kmpSearch(s, p, b, res, cnt);
  int k = 0;
  for (int j = 0; j < cnt; j++) {
   if (k != res[j]) break;
   k += p.length();
  }
  if (k == n) {
   return p.length();
  }
 }
 return 0;
}
int main() {
 int nTest;
 cin >> nTest;
 getline(cin, s);
 getline(cin, s);
 for (int i = 0; i < nTest; i++) {
  if (i > 0) cout << endl;
  getline(cin, s);
  cout << solve() << endl;
  getline(cin, s);
 }
 return 0;
}
It works well. Thanks. My question is how to distinguish following cases:
ReplyDelete1 abcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghij
----------------
length= 65
2 abcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghijA
----------------
length= 11
The length of two cases should be 11.
ABA
----------------
length= 3
abcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghij
----------------
length= 65
abcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghijAabcdefghijA
----------------
length= 11
abcabcabcabc
----------------
length= 3
bcbcbcbcbcbcbcbcbcbcbcbcbcbc
----------------
length= 2
dddddddddddddddddddd
----------------
length= 1
adcdefg
----------------
length= 7
bcbdbcbcbdbc
----------------
length= 6
hellohell
----------------
length= 9
ABCDABCD
----------------
length= 4
ABCDABCDA
----------------
length= 9
DABCDABCDA
----------------
length= 10
ABCDABCDE
----------------
length= 9
ABCABABCAB
----------------
length= 5
ABCABABCABA
----------------
length= 11
ABCABABCABAA
----------------
length= 12
ABCABABCABEA
----------------
length= 12
Thank You and that i have a super offer you: How Much Do House Repairs Cost home remodeling companies near me
ReplyDelete